Files
dsrc/sku.0/sys.server/compiled/game/script/gambling/base/slot.java
T
TekaohandGitHub 5c2e112349 Java 11.0.2 migration (#32)
* Code compiles - execution NOT tested

* updating gitignore

* Removed intellij settings files

* Removed more intellij files

* Added exclusion for JDK classes.

* Fixed purchasing script for vendors that have listed coin types.

* Updated script to not kick off until the entire preload is complete.

* adds static name entry for Solo movie poster and tcg9 vendor entry

* clean up empty and orphaned object templates

* adds placeholder black market (static) spawns

* corrects entries for the video game table to correctly set it in tcg series 2 and remove series 1 console errors

* Updated gitignore and removed intellij project files

* Fixed appearance reference for thranta payroll and kashyyyk door, added skipLosCheck objvar due to cannit see issue. Requires updated src

* Fixed appearance and template for terminal (#2)

* Fixed appearance and template for terminal (#3)

* Fixed appearance and template for terminal (#4)

* Deleted another faulty/orphaned object template

* Fixed gcw ranks option on frog. Only issue is that it doesn't award the officer commands or badges.

* Fixed some unneeded java 11 changes
2019-04-18 18:31:52 -05:00

517 lines
19 KiB
Java
Executable File

package script.gambling.base;
import script.dictionary;
import script.library.*;
import script.obj_id;
import java.util.Vector;
public class slot extends script.gambling.base.default_interface
{
public slot()
{
}
public int OnInitialize(obj_id self) throws InterruptedException
{
int slotBalance = getBankBalance(self);
if (slotBalance > 0)
{
transferBankCreditsToNamedAccount(self, money.ACCT_SLOT_STANDARD, slotBalance, "noHandler", "noHandler", new dictionary());
}
removeObjVar(self, gambling.VAR_TABLE_PLAYERS);
removeObjVar(self, gambling.VAR_GAME_BASE);
Vector reelOdds = gambling.calculateReelOdds(self);
if (reelOdds != null && reelOdds.size() > 0)
{
utils.setBatchScriptVar(self, gambling.VAR_REEL_ODDS, reelOdds);
}
return SCRIPT_CONTINUE;
}
public int handlePlayerAdded(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
showPayoutSchedule(self, player);
startSlotGame(self, player);
return SCRIPT_CONTINUE;
}
public int handlePlayerRemoved(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
String ovpath = gambling.VAR_GAME_PLAYERS + "." + player + ".pid";
if (utils.hasScriptVar(self, ovpath))
{
int pid = utils.getIntScriptVar(self, ovpath);
sui.closeSUI(player, pid);
}
removeObjVar(self, gambling.VAR_GAME_BASE);
return SCRIPT_CONTINUE;
}
public int handleBetPlaced(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId(money.DICT_PLAYER_ID);
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
obj_id nplayer = getObjIdObjVar(self, gambling.VAR_GAME_TURN_PLAYER);
if (!isIdValid(nplayer))
{
return SCRIPT_CONTINUE;
}
if (player == nplayer)
{
removeObjVar(self, gambling.VAR_GAME_TURN_BASE);
}
int ret = params.getInt(money.DICT_CODE);
int amt = params.getInt(money.DICT_AMOUNT);
if (ret == money.RET_FAIL || amt < 1)
{
dictionary d = new dictionary();
d.put("player", player);
messageTo(self, "handleBetFailed", d, 0, false);
return SCRIPT_CONTINUE;
}
String pidpath = gambling.VAR_GAME_PLAYERS + "." + player + ".pid";
if (utils.hasScriptVar(self, pidpath))
{
int oldpid = utils.getIntScriptVar(self, pidpath);
utils.removeScriptVar(self, pidpath);
sui.closeSUI(player, oldpid);
}
CustomerServiceLog("gambling", getGameTime() + ": (" + player + ") " + getName(player) + " bets " + amt + "cr to (" + self + ") " + utils.getStringName(self));
int balance = getBankBalance(self);
int max = getIntObjVar(self, gambling.VAR_TABLE_BET_MAX);
if (balance < max)
{
showSlotUi(self, player);
}
else
{
spinReels(self, player, amt);
}
return SCRIPT_CONTINUE;
}
public int handleBetFailed(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId(money.DICT_PLAYER_ID);
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
sendSystemMessage(player, gambling.SID_BET_FAILED);
return SCRIPT_CONTINUE;
}
public int handleBetTimer(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
obj_id nplayer = getObjIdObjVar(self, gambling.VAR_GAME_TURN_PLAYER);
if (!isIdValid(nplayer))
{
return SCRIPT_CONTINUE;
}
if (player != nplayer)
{
return SCRIPT_CONTINUE;
}
int pstamp = params.getInt("stamp");
int nstamp = getIntObjVar(self, gambling.VAR_GAME_TURN_STAMP);
if (nstamp != pstamp)
{
return SCRIPT_CONTINUE;
}
int balance = getBankBalance(self);
if (balance > 0)
{
spinReels(self, player, balance);
}
else
{
String svpath = gambling.VAR_GAME_PLAYERS + "." + player + ".pid";
int oldpid = utils.getIntScriptVar(self, svpath);
sui.closeSUI(player, oldpid);
utils.removeScriptVar(self, svpath);
gambling.removeTablePlayer(self, player, null);
}
return SCRIPT_CONTINUE;
}
public int handleSlotUi(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = sui.getPlayerId(params);
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
int balance = getBankBalance(self);
int bp = sui.getIntButtonPressed(params);
int max = getIntObjVar(self, gambling.VAR_TABLE_BET_MAX);
switch (bp)
{
case sui.BP_OK:
if (max > 0)
{
money.requestPayment(player, self, max - balance, "handleBetPlaced", null);
}
else
{
money.requestPayment(player, self, getTotalMoney(player), "handleBetPlaced", null);
}
break;
case sui.BP_CANCEL:
if (balance == 0)
{
gambling.removeTablePlayer(self, player, "");
}
else
{
spinReels(self, player, balance);
}
break;
case sui.BP_REVERT:
money.requestPayment(player, self, 1, "handleBetPlaced", null);
break;
}
return SCRIPT_CONTINUE;
}
public int handleReelsSpinning(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
int[] results = params.getIntArray("results");
if (results == null || results.length == 0)
{
return SCRIPT_CONTINUE;
}
int idx = params.getInt("idx");
if (idx < 0 || idx >= results.length)
{
return SCRIPT_CONTINUE;
}
if (!hasObjVar(self, "alwaysWinner"))
{
switch (rand(0, 1))
{
case 0:
results[idx] = 0;
break;
case 1:
Vector reelOdds = utils.getResizeableIntBatchScriptVar(self, gambling.VAR_REEL_ODDS);
if (reelOdds == null || reelOdds.size() == 0)
{
reelOdds = gambling.calculateReelOdds(self);
utils.setBatchScriptVar(self, gambling.VAR_REEL_ODDS, reelOdds);
}
int tmpIdx = rand(0, reelOdds.size() - 1);
results[idx] = (Integer) (reelOdds.elementAt(tmpIdx));
break;
}
}
else
{
Vector reelOdds = utils.getResizeableIntBatchScriptVar(self, gambling.VAR_REEL_ODDS);
if (reelOdds == null || reelOdds.size() == 0)
{
results[idx] = 0;
}
else
{
if (idx == 0)
{
int tmpIdx = rand(0, reelOdds.size() - 1);
results[0] = (Integer) (reelOdds.elementAt(tmpIdx));
}
else
{
results[idx] = results[0];
}
}
}
idx++;
params.put("results", results);
params.put("idx", idx);
String msg = "Slot Machine Pay Line\n";
msg += "-- ";
for (int i = 0; i < idx; i++)
{
msg += "| " + results[i] + " | ";
}
for (int i = idx; i < results.length; i++)
{
msg += "| " + getString(gambling.SID_ROLLING) + " | ";
}
msg += "--";
sendSystemMessageTestingOnly(player, msg);
if (idx >= results.length)
{
messageTo(self, "handleParseResults", params, 1.0f, false);
}
else
{
messageTo(self, "handleReelsSpinning", params, 3.0f, false);
}
return SCRIPT_CONTINUE;
}
public int handleParseResults(obj_id self, dictionary params) throws InterruptedException
{
int slotBalance = getBankBalance(self);
transferBankCreditsToNamedAccount(self, money.ACCT_SLOT_STANDARD, slotBalance, "noHandler", "noHandler", new dictionary());
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
int[] results = params.getIntArray("results");
if (results == null || results.length == 0)
{
return SCRIPT_CONTINUE;
}
int amt = params.getInt("amt");
if (amt < 1)
{
return SCRIPT_CONTINUE;
}
String gameType = getStringObjVar(self, gambling.VAR_TABLE_TYPE);
if (gameType == null || gameType.equals(""))
{
return SCRIPT_CONTINUE;
}
String tbl = "datatables/gambling/slot/" + gameType + ".iff";
int payout = gambling.parsePaySchedule(self, player, results, amt, tbl);
if (payout > 0)
{
CustomerServiceLog("gambling", getGameTime() + ": (" + player + ") " + getName(player) + " won: attempting to payout " + amt + "cr");
dictionary d = new dictionary();
d.put("player", player);
d.put("payout", payout);
transferBankCreditsFromNamedAccount(money.ACCT_SLOT_STANDARD, player, payout, "handleGamblingPayout", "noHandler", d);
}
else
{
CustomerServiceLog("gambling", getGameTime() + ": (" + player + ") " + getName(player) + " lost");
sendSystemMessageTestingOnly(player, "Sorry, you did not win this round. Please try again.");
messageTo(self, "handleDelayedRestart", params, 3.0f, false);
}
return SCRIPT_CONTINUE;
}
public int handleGamblingPayout(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
int payout = params.getInt("payout");
sendSystemMessageProse(player, prose.getPackage(gambling.PROSE_PAYOUT, payout));
CustomerServiceLog("gambling", getGameTime() + ": (" + player + ") " + getName(player) + " receives " + payout + "cr payout from (" + self + ") " + utils.getStringName(self));
showFlyText(self, gambling.FLY_WINNER, 2.0f, colors.RED);
messageTo(self, "handleDelayedRestart", params, 3.0f, false);
return SCRIPT_CONTINUE;
}
public int handleDelayedRestart(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return SCRIPT_CONTINUE;
}
obj_id player = params.getObjId("player");
if (!isIdValid(player))
{
return SCRIPT_CONTINUE;
}
obj_id[] players = getObjIdArrayObjVar(self, gambling.VAR_TABLE_PLAYERS);
if (utils.getElementPositionInArray(players, player) > -1)
{
startSlotGame(self, player);
}
return SCRIPT_CONTINUE;
}
private void startSlotGame(obj_id self, obj_id player) throws InterruptedException
{
if (!isIdValid(self) || !isIdValid(player))
{
return;
}
int totalMoney = getTotalMoney(player);
if (totalMoney < 1)
{
sendSystemMessage(player, gambling.SID_PLAYER_BROKE);
return;
}
showSlotUi(self, player);
}
private void showSlotUi(obj_id self, obj_id player) throws InterruptedException
{
if (!isIdValid(self) || !isIdValid(player))
{
return;
}
String gameType = getStringObjVar(self, gambling.VAR_TABLE_TYPE);
if (gameType == null || gameType.equals(""))
{
return;
}
utils.setScriptVar(self, gambling.VAR_TABLE_BET_ACCEPT, getGameTime());
String title = "@gambling/game_n:" + gameType;
String prompt = "Press the button corresponding to the desired action.";
Vector entries = new Vector();
entries.setSize(0);
int slotBalance = getBankBalance(self);
int playerCash = getCashBalance(player);
int playerBank = getBankBalance(player);
int playerTotal = getTotalMoney(player);
entries = utils.addElement(entries, "Current Bet: " + slotBalance);
int max = getIntObjVar(self, gambling.VAR_TABLE_BET_MAX);
if (max < 1)
{
entries = utils.addElement(entries, "Max Bet: " + playerTotal);
}
else
{
entries = utils.addElement(entries, "Max Bet: " + max);
}
entries = utils.addElement(entries, "Cash Balance: " + playerCash);
entries = utils.addElement(entries, "Bank Balance: " + playerBank);
entries = utils.addElement(entries, "Total Money : " + playerTotal);
int pid = -1;
if (slotBalance > 0)
{
pid = sui.listbox(self, player, prompt, sui.BET_MAX_BET_ONE_SPIN, title, entries, "handleSlotUi");
}
else
{
pid = sui.listbox(self, player, prompt, sui.BET_MAX_BET_ONE_QUIT, title, entries, "handleSlotUi");
}
if (pid == -1)
{
sendSystemMessageTestingOnly(player, "The slot machine was unable to create an interface for you.");
return;
}
utils.setScriptVar(self, gambling.VAR_GAME_PLAYERS + "." + player + ".pid", pid);
int now = getGameTime();
setObjVar(self, gambling.VAR_GAME_TURN_PLAYER, player);
setObjVar(self, gambling.VAR_GAME_TURN_STAMP, now);
dictionary d = new dictionary();
d.put("player", player);
d.put("stamp", now);
messageTo(self, "handleBetTimer", d, 60.0f, false);
}
private void spinReels(obj_id self, obj_id player, int amt) throws InterruptedException
{
if (!isIdValid(self) || !isIdValid(player) || amt < 1)
{
return;
}
String gameType = getStringObjVar(self, gambling.VAR_TABLE_TYPE);
if (gameType == null || gameType.equals(""))
{
return;
}
String tbl = "datatables/gambling/slot/" + gameType + ".iff";
String[] reel = dataTableGetStringColumnNoDefaults(tbl, "REEL");
if (reel == null || reel.length == 0)
{
sendSystemMessageTestingOnly(player, "This machine appears to be broken. Please try again later.");
return;
}
utils.removeScriptVar(self, gambling.VAR_TABLE_BET_ACCEPT);
dictionary d = new dictionary();
d.put("player", player);
d.put("amt", amt);
d.put("results", new int[3]);
d.put("idx", 0);
d.put("reel", reel);
sendSystemMessageTestingOnly(player, "You activate the machine and the reels start spinning...");
messageTo(self, "handleReelsSpinning", d, 5.0f, false);
}
private void showPayoutSchedule(obj_id self, obj_id player) throws InterruptedException
{
String gameType = getStringObjVar(self, gambling.VAR_TABLE_TYPE);
if (gameType == null || gameType.equals(""))
{
return;
}
String tbl = "datatables/gambling/slot/" + gameType + ".iff";
String[] schedule = dataTableGetStringColumnNoDefaults(tbl, "SCHEDULE");
if (schedule == null || schedule.length == 0)
{
return;
}
int[] payout_base = dataTableGetIntColumnNoDefaults(tbl, "PAYOUT_BASE");
if (payout_base == null || payout_base.length == 0)
{
return;
}
int[] payout_max = dataTableGetIntColumnNoDefaults(tbl, "PAYOUT_MAX");
if (payout_max == null || payout_max.length == 0)
{
return;
}
if (schedule.length != payout_base.length || schedule.length != payout_max.length)
{
return;
}
Vector entries = new Vector();
entries.setSize(0);
for (int i = 0; i < schedule.length; i++)
{
entries = utils.addElement(entries, schedule[i] + " -> base:" + payout_base[i] + " max:" + payout_max[i]);
}
if (entries == null || entries.size() == 0)
{
return;
}
String prompt = "The following is the payout schedule for this slot machine.\n\nLegend:\nXXX: denotes any 3 of the same number\n*X|Y|Z: denotes any combination of the 3 numbers\n";
sui.listbox(self, player, prompt, sui.OK_ONLY, "Payout Schedule", entries, "noHandler");
}
}