276 lines
7.5 KiB
Ucode
276 lines
7.5 KiB
Ucode
/*
|
|
--------------------------------------------------------------
|
|
KF_Roulette_Bet_Zone
|
|
--------------------------------------------------------------
|
|
|
|
Represents a distinct betting area on the Roulette table. Cash
|
|
thrown into this volume before the wheel spins will be considered
|
|
a valid bet.
|
|
|
|
Author : Alex Quick
|
|
|
|
--------------------------------------------------------------
|
|
*/
|
|
|
|
class KF_Roulette_Bet_Zone extends StaticMeshActor;
|
|
|
|
#exec OBJ LOAD FILE=Pier_SM.usx
|
|
#exec OBJ LOAD FILE=Pier_T.utx
|
|
|
|
/* A struct representing a player's bet on this number. */
|
|
struct SPlayerBetInfo
|
|
{
|
|
var PlayerController BettingPlayer;
|
|
var CashPickup BetPickup; // the cash pickup representing our bet and winnings.
|
|
};
|
|
|
|
|
|
enum EBetType
|
|
{
|
|
BET_Straight,
|
|
BET_Even,
|
|
BET_Odd,
|
|
BET_Red,
|
|
BET_Black,
|
|
BET_1st,
|
|
BET_2nd,
|
|
BET_3rd,
|
|
BET_Low,
|
|
BET_High,
|
|
};
|
|
|
|
var () EBetType ZoneType;
|
|
|
|
var () int ZoneNumber;
|
|
|
|
/* Reference to the table this zone belongs to */
|
|
var KF_Roulette_Wheel OwningTable;
|
|
|
|
/* Array of all the bets in this zone in the current spin - Cleared after each spin.*/
|
|
var array<SPlayerBetInfo> CurrentBets;
|
|
|
|
/* The amount this zone pays out when it hits. Set by OwningTable */
|
|
var float PayOutAmount;
|
|
|
|
var StaticMesh ChipPileSmall,ChipPileMedium,ChipPileHuge;
|
|
|
|
|
|
function OnActorLanded(Actor FallingActor)
|
|
{
|
|
local CashPickup Dosh;
|
|
Dosh = CashPickup(FallingActor);
|
|
if(Dosh != none)
|
|
{
|
|
if(OwningTable != none &&
|
|
OwningTable.AcceptNewBets())
|
|
{
|
|
AddBet(Dosh);
|
|
}
|
|
else
|
|
{
|
|
OwningTable.OnBetRejected();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* We didn't win anything on this tile .. remove the cash */
|
|
function ClearOldBets()
|
|
{
|
|
local int i,NumBets;
|
|
|
|
Numbets = CurrentBets.length ;
|
|
|
|
/* Remove all the old chips */
|
|
for(i = 0 ; i < NumBets ; i ++)
|
|
{
|
|
if(CurrentBets[i].BetPickup != none)
|
|
{
|
|
CurrentBets[i].BetPickup.Destroy();
|
|
}
|
|
}
|
|
|
|
CurrentBets.length = 0 ;
|
|
}
|
|
|
|
function OnWheelSpin()
|
|
{
|
|
local int i;
|
|
|
|
for(i = 0 ; i < Currentbets.Length ; i ++)
|
|
{
|
|
if(CurrentBets[i].BetPickup != none)
|
|
{
|
|
SetChipState(Currentbets[i].BetPickup,false);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Allows or disables pickup of chips from the table */
|
|
function SetChipState( CashPickup ChipStack , bool AllowPickup)
|
|
{
|
|
ChipStack.SetCollision(AllowPickup);
|
|
OwningTable.ClientSetChipMaterial(ChipStack,AllowPickup);
|
|
}
|
|
|
|
function AddBet(CashPickup Dosh)
|
|
{
|
|
local int ExistingIndex;
|
|
local bool bPlayerAlreadyBet;
|
|
|
|
if(Dosh == none ||
|
|
Dosh.DroppedBy == none ||
|
|
Dosh.DroppedBy.PlayerReplicationInfo == none)
|
|
{
|
|
return;
|
|
}
|
|
|
|
bPlayerAlreadyBet = FindExistingPlayer(Dosh,ExistingIndex);
|
|
|
|
/* This guy already has a bet here, just update the amount he put down */
|
|
if(bPlayerAlreadyBet)
|
|
{
|
|
CurrentBets[ExistingIndex].BetPickup.CashAmount += Dosh.CashAmount;
|
|
/* also update the mesh on the table */
|
|
|
|
CurrentBets[ExistingIndex].BetPickup.SetStaticMesh(GetChipMeshFor(CurrentBets[ExistingIndex].BetPickup.CashAmount));
|
|
}
|
|
else
|
|
{
|
|
CurrentBets.length = CurrentBets.length + 1;
|
|
CurrentBets[CurrentBets.length - 1].BettingPlayer = PlayerController(Dosh.DroppedBy);
|
|
Currentbets[CurrentBets.length - 1].BetPickup = Dosh;
|
|
|
|
OwningTable.AddPlayer(CurrentBets[CurrentBets.length - 1].BettingPlayer);
|
|
}
|
|
|
|
|
|
log("Adding : $"$Dosh.CashAmount$" Bet to :"@GetZoneName());
|
|
log("Current total on :"@GetZoneName()@" is : $"$CurrentBets[0].BetPickup.CashAmount);
|
|
|
|
/* turn it into a stack of chips when it hits the table */
|
|
|
|
if(!bPlayerAlreadyBet)
|
|
{
|
|
Dosh.bPreventFadeOut = true;
|
|
Dosh.LifeSpan = 0;
|
|
Dosh.SetStaticMesh(GetChipMeshFor(Dosh.CashAmount));
|
|
|
|
SetChipState(Dosh,false);
|
|
Dosh.bOnlyOwnerCanPickup = true;
|
|
Dosh.CashAmount = 0;
|
|
}
|
|
else
|
|
{
|
|
Dosh.Destroy();
|
|
}
|
|
|
|
|
|
OwningTable.OnAddBet();
|
|
}
|
|
|
|
/* Returns the total amount of bets placed on this part of the table */
|
|
function int GetBetTotal()
|
|
{
|
|
local int idx;
|
|
local int BetTotal;
|
|
|
|
for(idx = 0 ; idx < CurrentBets.length ; idx ++)
|
|
{
|
|
if(CurrentBets[idx].BetPickup != none &&
|
|
!CurrentBets[idx].BetPickup.bHidden)
|
|
{
|
|
BetTotal += CurrentBets[idx].BetPickup.CashAmount;
|
|
}
|
|
}
|
|
|
|
return BetTotal;
|
|
}
|
|
|
|
/* Determine which mesh to use for this cash pickup. Large values means larger chip piles */
|
|
function StaticMesh GetChipMeshFor( int CashAmount)
|
|
{
|
|
if(CashAmount <= 50)
|
|
{
|
|
return ChipPileSmall ;
|
|
}
|
|
else if(CashAmount <= 250)
|
|
{
|
|
return ChipPileMedium;
|
|
}
|
|
else
|
|
{
|
|
return ChipPileHuge;
|
|
}
|
|
}
|
|
|
|
/* Convert the Enum for this Zone's Type into a human readable name */
|
|
function string GetZoneName()
|
|
{
|
|
local String ZoneString;
|
|
|
|
switch(ZoneType)
|
|
{
|
|
case BET_Straight : ZoneString = string(ZoneNumber); break;
|
|
case BET_Even : ZoneString = "Evens"; break;
|
|
case BET_Odd : ZoneString = "Odds"; break;
|
|
case BET_Black : ZoneString = "Black"; break;
|
|
case BET_Red : ZoneString = "Red" ; break;
|
|
case BET_1st : ZoneString = "First12"; break;
|
|
case BET_2nd : ZoneString = "Second12"; break;
|
|
case Bet_3rd : ZoneString = "Third12"; break;
|
|
case Bet_Low : ZoneString = "Low"; break;
|
|
case Bet_High : ZoneString = "High"; break;
|
|
}
|
|
|
|
return ZoneString;
|
|
}
|
|
|
|
function PayOut()
|
|
{
|
|
local int i;
|
|
local int PayOutSum;
|
|
|
|
for(i = 0 ; i < CurrentBets.length ; i ++)
|
|
{
|
|
if(CurrentBets[i].BettingPlayer != none )
|
|
{
|
|
PayOutSum = (CurrentBets[i].BetPickup.CashAmount + (CurrentBets[i].BetPickup.CashAmount * PayOutAmount));
|
|
|
|
log("*************************");
|
|
log(GetZoneName()@" Paid out $"$PayOutSum@" to - "@CurrentBets[i].BettingPlayer.PlayerReplicationInfo.PlayerName);
|
|
|
|
CurrentBets[i].BetPickup.CashAmount = PayOutSum;
|
|
CurrentBets[i].BetPickup.SetStaticMesh(GetChipMeshFor(PayOutSum));
|
|
SetChipState(CurrentBets[i].BetPickup,true);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Has this player already placed a bet in this zone or not ? */
|
|
function bool FindExistingPlayer(CashPickup Dosh, optional out int ExistingIndex)
|
|
{
|
|
local int i;
|
|
|
|
for(i = 0 ; i < CurrentBets.length ; i ++)
|
|
{
|
|
if(CurrentBets[i].BettingPlayer == Dosh.DroppedBy &&
|
|
CurrentBets[i].BetPickup != none &&
|
|
!CurrentBets[i].BetPickup.bHidden )
|
|
{
|
|
ExistingIndex = i;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
StaticMesh = StaticMesh'Pier_SM.1'
|
|
|
|
ChipPileSmall = StaticMesh'Pier_SM.Env_Pier_Chips_Small'
|
|
ChipPileMedium = StaticMesh'Pier_SM.Env_Pier_Chips_Medium'
|
|
ChipPileHuge = StaticMesh'Pier_SM.Env_Pier_Chips_Large'
|
|
}
|