/SlotGame.hx
Haxe | 423 lines | 387 code | 32 blank | 4 comment | 73 complexity | be5679c149bc7aa81e8503c4ac962c69 MD5 | raw file
- import flash.display.Sprite;
- import flash.display.MovieClip;
- import flash.events.Event;
- import flash.events.KeyboardEvent;
- import flash.text.TextField;
- import flash.text.TextFormat;
- import flash.text.TextFormatAlign;
- class SlotGame extends Sprite {
- inline static var BLANK:Int = 0;
- inline static var BAR1 = 1;
- inline static var BAR2 = 2;
- inline static var BAR3 = 3;
- inline static var CHERRY = 6;
- inline static var SEVEN = 7;
- public var reels:Array<Array<Int>>;
- public var payout:Array<Int>;
- public var balance:Int;
- var balance_delta:Int;
- var jackpot_disabled:Bool;
- var altered_chance:Bool;
- public var bet:Int;
- public var multiply:Int;
- public var result:Array<Int>;
- public var win:Array<Int>;
- public var state:Int; // 0 idle 1 spin 2 result
- var display:Display;
- public function new() {
- super();
- trace('init');
- result = new Array();
- win = [0,0,0];
- payout = [250,100,50,40,30,30,30,25,20,15,10,10,5,2];
- reels = [[1,0,7,0,1,0,2,0,6,0,1,0,7,0,2,0,1,0,1,0,6,0,1,0,3,0],
- [6,0,1,0,2,0,1,0,6,0,1,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0],
- [3,0,1,0,3,0,2,0,3,0,6,0,2,0,3,0,2,0,3,0,7,0,3,0,2,0],
- [1,0,3,0,1,0,6,0,1,0,7,0,1,0,2,0,1,0,2,0,1,0,6,0,1,0]];
- // reels_init = [[6,2,1,2,2],[7,2,1,2,1],[1,4,6,1,1],[7,2,1,2,1]];
- bet = 0;
- multiply = 1;
- balance = 0;
- balance_delta = 10;
- flash.Lib.current.stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down );
- flash.Lib.current.stage.addEventListener(KeyboardEvent.KEY_UP, key_up );
- display = new Display(this);
- addChild(display);
- }
- public function random_result() {
- for (i in 0 ... 4)
- result[i] = Std.random(26);
- }
- function _compare(x, y) {
- if (x == y)
- return 0;
- if (x > y)
- return -1;
- else
- return 1;
- }
- public function calculate_win() {
- var outcome = [[0,0,0,0],[0,0,0,0],[0,0,0,0]];
- trace("result is " + result);
- for (r in 0 ... 4) {
- outcome[0][r] = reels[r][result[r]];
- if (result[r] == 0)
- outcome[1][r] = reels[r][25]
- else
- outcome[1][r] = reels[r][result[r] - 1];
- if (result[r] == 25)
- outcome[2][r] = reels[r][0];
- else
- outcome[2][r] = reels[r][result[r] + 1];
- }
- for (l in 0 ... 3)
- outcome[l].sort(_compare);
- trace("outcome is " + outcome[0] + " " + outcome[1] + " " + outcome[2]);
- for (l in 0 ... 3) {
- if (l == 1 && bet < 2)
- continue;
- if (l == 2 && bet < 3)
- continue;
- var out = outcome[l].join("");
- if (out.indexOf("7777") > -1) {
- win[l] = 250;
- continue;
- }
- if (out.indexOf("3333") > -1) {
- win[l] = 100;
- continue;
- }
- if (out.indexOf("2222") > -1) {
- win[l] = 50;
- continue;
- }
- if (out.indexOf("1111") > -1) {
- win[l] = 40;
- continue;
- }
- if (out.indexOf("6666") > -1) {
- win[l] = 30;
- continue;
- }
- if (out.indexOf("777") > -1) {
- win[l] = 30;
- continue;
- }
- if (out.indexOf("333") > -1) {
- win[l] = 25;
- continue;
- }
- if (out.indexOf("222") > -1) {
- win[l] = 20;
- continue;
- }
- if (out.indexOf("111") > -1) {
- win[l] = 15;
- continue;
- }
- if (out.indexOf("666") > -1) {
- win[l] = 10;
- continue;
- }
- if (out.indexOf("66") > -1) {
- win[l] = 5;
- continue;
- }
- if (out.indexOf("6") > -1) {
- win[l] = 2;
- continue;
- }
- }
- trace("win is " + win[0] + " " + win[1] + " " + win[2]);
- }
- function key_up(e:KeyboardEvent) {
- switch(e.charCode) {
- case 113: //q
- jackpot_disabled = false;
- trace ("jackpot enabled");
- case 111: //o
- altered_chance = false;
- trace ("payout 75%");
- case 97: //a
- balance_delta = 10;
- case 110: //n
- balance_delta = 10;
- }
- }
- function key_down(e:KeyboardEvent) {
- switch(e.charCode) {
- case 113: //q
- if (jackpot_disabled)
- return;
- jackpot_disabled = true;
- trace ("jackpot disabled");
- case 111: //o
- if (altered_chance)
- return;
- altered_chance = true;
- trace ("payout 85%");
- case 97: //a
- balance_delta = 1;
- case 110: //n
- balance_delta = 5;
- case 120: //x
- coin_in();
- case 122: //z
- coin_out();
- case 98: //b
- play_bet();
- case 99: //c
- play_bet_max();
- case 100: //d
- play_start();
- case 101: //e
- cash_out();
- case 115: //s
- show_history();
- }
- }
- function play_bet() {
- trace("bet");
- if (bet < 7 && balance - bet > 0)
- bet = bet + 1;
- else
- bet = 1;
- if (bet > 3)
- multiply = bet - 2;
- else
- multiply = 1;
- }
- function play_bet_max() {
- trace("bet_max");
- if (balance > 6)
- bet = 7;
- else
- bet = balance;
- if (bet > 3)
- multiply = bet - 2;
- else
- multiply = 1;
- }
- function play_start() {
- if (balance < 1)
- return;
- trace("start");
- win = [0,0,0];
- balance = balance - bet;
- random_result();
- state = 1;
- // TODO: spin
- calculate_win();
- for (l in 0 ... 3) {
- balance = balance + win[l];
- //win[r] = 0;
- }
- if (bet > balance)
- bet = balance;
- }
- function cash_out() {
- trace("cash_out");
- }
- function coin_in() {
- trace("coin_in");
- balance += balance_delta;
- if (bet < 1)
- bet = 1;
- }
- function coin_out() {
- trace("coin_out");
- balance -= balance_delta;
- }
- function show_history() {
- trace("show_history");
- }
- static function main() {
- var game:SlotGame = new SlotGame();
- flash.Lib.current.addChild(game);
- }
- }
- class Display extends Sprite {
- var game:SlotGame;
- var reel:Array<Sprite>;
- var position:Array<Float>;
- var speed:Array<Float>;
- var balance:TextField;
- var bet:TextField;
- var win:TextField;
- var fmt:TextFormat;
- var fmt2:TextFormat;
- var bet_selector:Array<Sprite>;
- var multiply_selector:Array<Sprite>;
- public function new(game:SlotGame) {
- super();
- this.game = game;
- trace('display init');
- var back:MovieClip = flash.Lib.attach("back");
- addChild(back);
- reel = new Array();
- position = new Array();
- speed = new Array();
- bet_selector = new Array();
- multiply_selector = new Array();
- var colors = [0xf0f0f0, 0xcccccc, 0x666666, 0x000000, 0x880000, 0xcccc00];
- for (r in 0 ... 4) {
- var mc = new Sprite();
- var gfx = new Sprite();
- position[r] = 0;
- speed[r] = 1;
- for (i in 0 ... 13) {
- mc.graphics.beginFill(colors[game.reels[r][i * 2]]);
- mc.graphics.drawRect(0, i * 120, 100, 120);
- if (game.reels[r][i * 2] == 1)
- gfx = flash.Lib.attach("bar1");
- if (game.reels[r][i * 2] == 2)
- gfx = flash.Lib.attach("bar2");
- if (game.reels[r][i * 2] == 3)
- gfx = flash.Lib.attach("bar3");
- if (game.reels[r][i * 2] == 6)
- gfx = flash.Lib.attach("cherry");
- if (game.reels[r][i * 2] == 7)
- gfx = flash.Lib.attach("seven");
- if (game.reels[r][i * 2] > 0) {
- mc.addChild(gfx);
- gfx.y = 120 * i;
- }
- }
- addChild(mc);
- mc.x = 30 + r * 110;
- //mc.y = 140;
- reel[r] = mc;
- position[r] = 0;
- }
- for (i in 0 ... 3) {
- var s = new Sprite();
- s.graphics.beginFill(0xff0000);
- s.graphics.drawRect(0, 0, 430, 1);
- s.graphics.drawRect(-30, -30, 30, 30);
- s.x = 30;
- s.y = 280 + 80 * i;
- addChild(s);
- bet_selector[i] = s;
- }
- for (i in 0 ... 5) {
- var s = new Sprite();
- s.graphics.beginFill(0x880000);
- s.graphics.drawRect(0, 0, 40, 580);
- s.x = 590 + 40 * i;
- s.y = 10;
- addChild(s);
- multiply_selector[i] = s;
- }
- var front:MovieClip = flash.Lib.attach("front");
- addChild(front);
- fmt = new TextFormat();
- fmt.font = "fixed";
- fmt.size = 40;
- fmt.color = 0xff0000;
- fmt.align = TextFormatAlign.CENTER;
- fmt2 = new TextFormat();
- fmt2.font = "fixed";
- fmt2.size = 16;
- fmt2.color = 0x330000;
- fmt2.align = TextFormatAlign.CENTER;
- for (i in 0 ... 5) {
- for (r in 0 ... 14) {
- var t:TextField = new TextField();
- t.x = 590 + 40 * i;
- t.y = 40 + 40 * r;
- t.width = 40;
- t.height = 40;
- t.text = Std.string(game.payout[r] * (i + 1));
- t.setTextFormat(fmt2);
- addChild(t);
- }
- }
- balance = new TextField();
- balance.selectable = false;
- addChild(balance);
- balance.y = 540;
- balance.x = 10;
- balance.width = 130;
- bet = new TextField();
- bet.selectable = false;
- addChild(bet);
- bet.y = 540;
- bet.x = 170;
- bet.width = 130;
- win = new TextField();
- addChild(win);
- win.y = 540;
- win.x = 330;
- win.width = 130;
- flash.Lib.current.stage.addEventListener(Event.ENTER_FRAME, loop);
- }
- private function loop(e:Event) {
- balance.text = Std.string(game.balance);
- balance.setTextFormat(fmt);
- bet.text = Std.string(game.bet);
- bet.setTextFormat(fmt);
- win.text = Std.string((game.win[0] + game.win[1] + game.win[2]) * game.multiply);
- win.setTextFormat(fmt);
- for (r in 0 ... 4)
- reel[r].y = 240 - game.result[r] * 60;
- for (r in 0 ... 3)
- bet_selector[r].visible = false;
- if (game.bet == 1)
- bet_selector[1].visible = true;
- if (game.bet > 1) {
- bet_selector[0].visible = true;
- bet_selector[1].visible = true;
- }
- if (game.bet > 2) {
- bet_selector[0].visible = true;
- bet_selector[1].visible = true;
- bet_selector[2].visible = true;
- }
- for (r in 0 ... 5)
- multiply_selector[r].visible = false;
- if (game.bet < 4)
- multiply_selector[0].visible = true;
- if (game.bet == 4)
- multiply_selector[1].visible = true;
- if (game.bet == 5)
- multiply_selector[2].visible = true;
- if (game.bet == 6)
- multiply_selector[3].visible = true;
- if (game.bet == 7)
- multiply_selector[4].visible = true;
- }
- public function refresh() {
- }
- }