mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-14 23:07:51 -04:00
* 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
517 lines
19 KiB
Java
Executable File
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");
|
|
}
|
|
}
|