//===== Hercules Script ======================================
//= Wheel of Fortune
//===== By ===================================================
//= Habilis
//= Edited by Myriad
//===== Version ==============================================
//= 1.02 - June 15, 2018
// - Made the script work with zeny, to be more accesibly to everyone.
//= 1.01 - June 14, 2018
// - Added @wheel_of_fortune GM command (level 98+).
// - Merged S_Pay and S_Loop subs into main line of text.
// - S_Gamble is now S_Spin and it will 'return' instead of
// calling back to the initial sub.
//= 1.00 - June 13, 2018
// - Initial script edit for Habilis.
//===== Description ==========================================
//= Wheel of fortune something.
//============================================================
- script Wheel_of_Fortune FAKE_NPC ,{
OnInit:
// disablenpc("Wheel of Fortune#Main");
// disablenpc("Hussein#WOF");
.EventName$ = "[Wheel Of Fortune]";
end;
/*
OnClock1309:
OnClock1200:
OnClock1600:
OnClock2000:
OnClock2200:
*/
start:
.start = true;
announce(sprintf("%s : The event will begin in 1 minute, near the center of Prontera.", .EventName$), bc_blue | bc_all);
initnpctimer();
end;
OnTimer60000: // 1 min
enablenpc("Wheel of Fortune#Main");
enablenpc("Hussein#WOF");
announce(sprintf("%s : Come to Prontera and test your luck", .EventName$), bc_blue | bc_all);
end;
OnTimer1800000: // 30 mins
announce(sprintf("%s : One more minute, do your last spin!", .EventName$), bc_blue | bc_all);
end;
OnTimer1860000: // 31 mins
OnStop:
.start = false;
stopnpctimer();
// disablenpc("Wheel of Fortune#Main");
// disablenpc("Hussein#WOF");
end;
OnCommand:
if (.@atcmd_numparameters != 1) {
dispbottom(sprintf("Usage: %s <start/end>", .@atcmd_command$), 0x00FF00);
dispbottom(sprintf("%s failed.", .@atcmd_command$), 0x00FF00);
end;
}
if (.@atcmd_parameters$[0] == "start") {
if (!.start)
donpcevent(sprintf("%s::OnStart", strnpcinfo(NPC_NAME)));
else {
dispbottom("The Wheel of Fortune has already started.", 0x00FF00);
dispbottom(sprintf("%s failed.", .@atcmd_command$), 0x00FF00);
}
} else if (.@atcmd_parameters$[0] == "end") {
if (.start)
donpcevent(sprintf("%s::OnEnd", strnpcinfo(NPC_NAME)));
else {
dispbottom("The Wheel of Fortune is not active.", 0x00FF00);
dispbottom(sprintf("%s failed.", .@atcmd_command$), 0x00FF00);
}
} else {
dispbottom(sprintf("Usage: %s <start/end>", .@atcmd_command$), 0x00FF00);
dispbottom(sprintf("%s failed.", .@atcmd_command$), 0x00FF00);
}
end;
}
mall,88,125,6 script Wheel of Fortune#Main 2_SLOT_MACHINE,{
OnTalk:
if (countitem(.RequiredItem_id) >= .RequiredItem_qty && #freewheelfortunespin < 0) {
mesf("[^0055FF%s^000000]", .EventName$);
mes("You are out of Zeny");
mes("and have no more");
mes("free spins. Come back");
mes("next time for more!");
close();
}
.@mes$ = (#freewheelfortunespin > 0) ? sprintf(", but you, my friend, have %d free spin%s!", #freewheelfortunespin, (#freewheelfortunespin == 1) ? "" : "s") : ".";
cutin("aca_salim02", 2);
addtimer(1, sprintf("%s::OnEnd", strnpcinfo(NPC_NAME)));
mesf("[^0055FF%s^000000]", .EventName$);
mes("Do you want to spin the wheel?");
mesf("It costs ^FF0000%d Zeny^000000 to play%s", .RequiredItem_qty, .@mes$);
next();
while (true) {
if (countitem(.RequiredItem_id) >= .RequiredItem_qty && #freewheelfortunespin < 0)
callsub(S_End);
switch (select(
(#freewheelfortunespin > 0) ? sprintf("Yes! Use free spin! (%d left)", #freewheelfortunespin) : "",
if (countitem(.RequiredItem_id) >= .RequiredItem_qty) ? sprintf("Yes! Use Zeny. (costs %dz)", .RequiredItem_qty) : "",
"No (Leave)"
)) {
// pay with free spin
case 1:
if (#freewheelfortunespin > 0) {
if ((#freewheelfortunespin -= 1) < 0)
#freewheelfortunespin = 0;
callsub(S_Spin);
} else
callsub(S_End);
break;
// Pay with zeny
case 2:
if (countitem(.RequiredItem_id) >= .RequiredItem_qty) {
delitem(.RequiredItem_id, .RequiredItem_qty);
callsub(S_Spin);
} else {
cutin("aca_salim02", 2);
mesf("[^0055FF%s^000000]", .EventName$);
mes("Awww, you don't have enough to gamble...");
mes(" ");
mes("Have you ever heard?");
mes("'Money isn't all that matters' Got it?");
mes("Byeeeeeeeeeeeeee ;)");
callsub(S_End);
}
break;
default:
callsub(S_End);
}
}
// Wheel spin animation
S_Spin:
.@Sector = rand(.Sector_Range[0], .Sector_Range[1]);
.@Display = .@Sector * 2 - 1;
.@Speed = .Spin_Speed;
for (.@i = 0; .@i < .nbTurns; .@i++) {
.@b = .Cutin_Range[0];
while (.@b <= .Cutin_Range[1]) {
cutin(sprintf("%s%d", .Cutin$, .@b), 4);
sleep2(.@Speed);
.@b++;
.@Speed += 1; // not ++, because you may want to adjust the stopping +1 +2 +3
}
}
.@b = .Cutin_Range[0];
while (.@b < .@Display) {
cutin(sprintf("%s%d", .Cutin$, .@b), 4);
sleep2(.@Speed);
.@b++;
}
cutin(sprintf("%s%d", .Cutin$, .@b), 4);
if (.Prize_ID[.@Sector] == -1) {
// Free spin
if (.Sound_Effects)
soundeffect("wheel_jackpot.wav", 0);
announce(sprintf("[%s] : Wow, %dx more Free spins!!!", .EventName$, .Prize_Qty[.@Sector]), bc_blue | bc_self);
#freewheelfortunespin = #freewheelfortunespin == 0 ? .Prize_Qty[.@Sector] : #freewheelfortunespin + .Prize_Qty[.@Sector];
} else if (.Prize_ID[.@Sector] == 0) {
// Nothing
if (.Sound_Effects)
soundeffect("wheel_lost.wav", 0);
announce(sprintf("[%s] : Awwww, no luck in your gamble, more luck in love...", .EventName$), bc_blue | bc_self);
} else {
// Item
if (.Sound_Effects)
soundeffect("wheel_won.wav", 0);
announce(sprintf("[%s] : %dx %s - enjoy your prize!", .EventName$, .Prize_Qty[.@Sector], getitemname(.Prize_ID[.@Sector])), bc_blue | bc_self);
getitem(.Prize_ID[.@Sector], .Prize_Qty[.@Sector]);
}
sleep2(1000);
if(countitem(.RequiredItem_id) >= .RequiredItem_qty && #freewheelfortunespin < 0) {
mesf("[^0055FF%s^000000]", .EventName$);
mes("You are out of Zeny");
mes("and have no more");
mes("free spins. Come back");
mes("next time for more!");
close();
}
return;
S_End:
close2();
OnEnd:
cutin("", 255);
end;
OnInit:
.EventName$ = "Wheel Of Fortune";
bindatcmd("wheel_of_fortune", "Wheel_of_Fortune::OnCommand", 98, 98, false);
.Spin_Speed = 50; // What is the base spin speed? (ms)
.nbTurns = 2; // How many times the arrow makes a complete turn, before entering the stopping routine
.RequiredItem_id = 7227;
.RequiredItem_qty = 1; // How much zeny does it cost for a spin?
.Sound_Effects = true; // Enable sound effects? (true/false)
// You must have a total of 10 prizes. DO NOT remove 0 or -1 from the array and do not
// change their order.
setarray(.Prize_ID[1], -1, 12103, 13277, 12187, 617, 607, 12186, 604, 0, 7040);
setarray(.Prize_Qty[1], 2, 1, 1, 1, 3, 3, 1, 3, 0, 3);
// Don't touch below
.Cutin$ = "WheelOfFortune_";
setarray(.Sector_Range, 1, 10); // Sector range
setarray(.Cutin_Range, 0, 19); // Cutin range
end;
}
mall,88,125,3 script Hussein#WOF 1_M_MERCHANT,{
.@name$ = "[Hussein]";
cutin("aca_salim02", 2);
mes(.@name$);
mes("I command you to spin");
mes("the Wheel of Fortune!");
next();
getmapxy(.@map$, .@x, .@y, UNITTYPE_NPC, "Wheel of Fortune#Main");
warp(.@map$, .@x - 1, .@y - 2, 0);
doevent("Wheel of Fortune#Main::OnTalk");
end;
OnInit:
while(1) {
waitingroom "Wheel of Fortune",0;
sleep 10000;
delwaitingroom;
}
end;
}