Add behemoth piece; fix sync issues.
This commit is contained in:
parent
62e553a2e8
commit
21041e7476
@ -38,7 +38,7 @@ impl Tile {
|
||||
pub struct Board {
|
||||
pub tiles:[Tile; 61],
|
||||
pub columns:[Column; 9],
|
||||
pub pieces:[Option<Piece>; 38],
|
||||
pub pieces:[Option<Piece>; PIECES_TOTAL],
|
||||
}
|
||||
impl Board {
|
||||
pub fn new() -> Self
|
||||
@ -46,14 +46,14 @@ impl Board {
|
||||
Self {
|
||||
tiles:[Tile::new(); 61],
|
||||
columns:[Column::new(); 9],
|
||||
pieces:[None; 38],
|
||||
pieces:[None; PIECES_TOTAL],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn init(&mut self) {
|
||||
self.tiles = [Tile::new(); 61];
|
||||
self.columns = [Column::new(); 9];
|
||||
self.pieces = [None; 38];
|
||||
self.pieces = [None; PIECES_TOTAL];
|
||||
|
||||
let layout = [
|
||||
(Piece::new(PIECE_MILITIA, PLAYER_DAWN), Hex::from_hex(0, 1)),
|
||||
@ -78,7 +78,8 @@ impl Board {
|
||||
(Piece::new(PIECE_TOWER, PLAYER_DAWN), Hex::from_hex(3, 0)),
|
||||
(Piece::new(PIECE_TOWER, PLAYER_DAWN), Hex::from_hex(5, 1)),
|
||||
|
||||
(Piece::new(PIECE_DRAGON, PLAYER_DAWN), Hex::from_hex(4, 1)),
|
||||
(Piece::new(PIECE_DRAGON, PLAYER_DAWN), Hex::from_hex(4, 2)),
|
||||
(Piece::new(PIECE_BEHEMOTH, PLAYER_DAWN), Hex::from_hex(4, 1)),
|
||||
|
||||
(Piece::new(PIECE_OMEN, PLAYER_DAWN), Hex::from_hex(4, 0)),
|
||||
];
|
||||
|
@ -1,12 +1,14 @@
|
||||
pub const PLAYER_DAWN :u8 = 0;
|
||||
pub const PLAYER_DUSK :u8 = 1;
|
||||
|
||||
pub const PIECES_COUNT :usize = 7;
|
||||
pub const PIECE_NONE :u8 = PIECES_COUNT as u8 + 1;
|
||||
pub const PIECE_MILITIA :u8 = 0;
|
||||
pub const PIECE_LANCE :u8 = 1;
|
||||
pub const PIECE_KNIGHT :u8 = 2;
|
||||
pub const PIECE_TOWER :u8 = 3;
|
||||
pub const PIECE_CASTLE :u8 = 4;
|
||||
pub const PIECE_DRAGON :u8 = 5;
|
||||
pub const PIECE_OMEN :u8 = 6;
|
||||
pub const PIECES_TOTAL :usize = 40;
|
||||
pub const PIECES_COUNT :usize = 8;
|
||||
pub const PIECE_NONE :u8 = PIECES_COUNT as u8 + 1;
|
||||
pub const PIECE_MILITIA :u8 = 0;
|
||||
pub const PIECE_LANCE :u8 = 1;
|
||||
pub const PIECE_KNIGHT :u8 = 2;
|
||||
pub const PIECE_TOWER :u8 = 3;
|
||||
pub const PIECE_CASTLE :u8 = 4;
|
||||
pub const PIECE_DRAGON :u8 = 5;
|
||||
pub const PIECE_BEHEMOTH :u8 = 6;
|
||||
pub const PIECE_OMEN :u8 = 7;
|
||||
|
@ -5,6 +5,8 @@ use crate::{
|
||||
piece::Piece,
|
||||
};
|
||||
|
||||
pub type Pool = [u8; 7];
|
||||
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
pub enum GameState {
|
||||
None,
|
||||
@ -17,7 +19,7 @@ pub struct Game {
|
||||
pub turn:u16,
|
||||
pub state:GameState,
|
||||
pub board:Board,
|
||||
pub pool:[[u8; 6]; 2],
|
||||
pub pool:[Pool; 2],
|
||||
|
||||
pub history:Vec<Play>,
|
||||
}
|
||||
@ -30,7 +32,7 @@ impl Game {
|
||||
turn:0,
|
||||
|
||||
board:Board::new(),
|
||||
pool:[[0; 6]; 2],
|
||||
pool:[Pool::default(); 2],
|
||||
|
||||
history:Vec::new(),
|
||||
}
|
||||
@ -74,7 +76,6 @@ impl Game {
|
||||
|
||||
// Check for piece swap.
|
||||
if piece.player == target.player {
|
||||
println!("swap");
|
||||
swap = true;
|
||||
target.tile = play.from;
|
||||
}
|
||||
|
@ -93,7 +93,18 @@ pub const PIECES :[PieceClass; PIECES_COUNT] = [
|
||||
},
|
||||
},
|
||||
PieceClass {
|
||||
name: "King",
|
||||
name: "Behemoth",
|
||||
moves: MoveSet {
|
||||
direction:0,
|
||||
stride:0,
|
||||
},
|
||||
pmoves: MoveSet {
|
||||
direction:0,
|
||||
stride:0,
|
||||
},
|
||||
},
|
||||
PieceClass {
|
||||
name: "Omen",
|
||||
moves: MoveSet {
|
||||
direction:0,
|
||||
stride:0,
|
||||
|
@ -149,6 +149,7 @@ async fn main()
|
||||
"promote.svg",
|
||||
|
||||
"omen_dawn.svg",
|
||||
"behemoth_dawn.svg",
|
||||
"dragon_dawn.svg",
|
||||
"castle_dawn.svg",
|
||||
"tower_dawn.svg",
|
||||
@ -157,6 +158,7 @@ async fn main()
|
||||
"militia_dawn.svg",
|
||||
|
||||
"omen_dusk.svg",
|
||||
"behemoth_dusk.svg",
|
||||
"dragon_dusk.svg",
|
||||
"castle_dusk.svg",
|
||||
"tower_dusk.svg",
|
||||
|
@ -3,6 +3,8 @@ use crate::{
|
||||
util::pack::pack_u16,
|
||||
};
|
||||
|
||||
use game::game::Pool;
|
||||
|
||||
use super::Packet;
|
||||
|
||||
#[derive(Clone)]
|
||||
@ -64,9 +66,9 @@ pub struct PacketGameStateResponse {
|
||||
pub turn:u16,
|
||||
pub dawn_handle:String,
|
||||
pub dusk_handle:String,
|
||||
pub dawn_pool:[u8; 6],
|
||||
pub dusk_pool:[u8; 6],
|
||||
pub pieces:[PacketGameStateResponsePiece; 38],
|
||||
pub dawn_pool:Pool,
|
||||
pub dusk_pool:Pool,
|
||||
pub pieces:[PacketGameStateResponsePiece; game::consts::PIECES_TOTAL],
|
||||
}
|
||||
impl PacketGameStateResponse {
|
||||
pub fn new() -> Self
|
||||
@ -76,9 +78,9 @@ impl PacketGameStateResponse {
|
||||
turn:0,
|
||||
dawn_handle:String::new(),
|
||||
dusk_handle:String::new(),
|
||||
dawn_pool:[0; 6],
|
||||
dusk_pool:[0; 6],
|
||||
pieces:[PacketGameStateResponsePiece::new(); 38],
|
||||
dawn_pool:Pool::default(),
|
||||
dusk_pool:Pool::default(),
|
||||
pieces:[PacketGameStateResponsePiece::new(); game::consts::PIECES_TOTAL],
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -103,14 +105,16 @@ impl Packet for PacketGameStateResponse {
|
||||
| ((self.dawn_pool[2] as u16) << 7)
|
||||
| ((self.dawn_pool[3] as u16) << 9)
|
||||
| ((self.dawn_pool[4] as u16) << 11)
|
||||
| ((self.dawn_pool[5] as u16) << 13);
|
||||
| ((self.dawn_pool[5] as u16) << 13)
|
||||
| ((self.dawn_pool[6] as u16) << 14);
|
||||
|
||||
let dusk_pool_bytes :u16 = self.dusk_pool[0] as u16
|
||||
| ((self.dusk_pool[1] as u16) << 5)
|
||||
| ((self.dusk_pool[2] as u16) << 7)
|
||||
| ((self.dusk_pool[3] as u16) << 9)
|
||||
| ((self.dusk_pool[4] as u16) << 11)
|
||||
| ((self.dusk_pool[5] as u16) << 13);
|
||||
| ((self.dusk_pool[5] as u16) << 13)
|
||||
| ((self.dusk_pool[6] as u16) << 14);
|
||||
|
||||
[
|
||||
pack_u16(self.status),
|
||||
|
86
www/asset/behemoth_dawn.svg
Normal file
86
www/asset/behemoth_dawn.svg
Normal file
@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="120"
|
||||
height="120"
|
||||
viewBox="0 0 120 120"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
sodipodi:docname="behemoth_dawn.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#111111"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="1"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:zoom="9.8416665"
|
||||
inkscape:cx="61.117698"
|
||||
inkscape:cy="58.628282"
|
||||
inkscape:window-width="2588"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="1257"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer1">
|
||||
<inkscape:grid
|
||||
id="grid1"
|
||||
units="px"
|
||||
originx="0"
|
||||
originy="0"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
empcolor="#0099e5"
|
||||
empopacity="0.30196078"
|
||||
color="#0099e5"
|
||||
opacity="0.14901961"
|
||||
empspacing="5"
|
||||
dotted="false"
|
||||
gridanglex="30"
|
||||
gridanglez="30"
|
||||
visible="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#ffe082;fill-opacity:1;stroke-width:0.707108"
|
||||
id="rect2-4-8-6"
|
||||
width="60"
|
||||
height="5"
|
||||
x="30"
|
||||
y="105" />
|
||||
<path
|
||||
id="path1"
|
||||
style="fill:#ffe082;fill-opacity:1"
|
||||
d="M 41 21 L 35 23 L 33 26 L 31 32 L 31 37 L 32 41 L 31 44 L 28 46 L 25 43 L 24 35 L 25 29 L 27 24 L 23 27 L 21 30 L 20 34 L 19 40 L 20 47 L 24 52 L 30 53 L 36 52 L 39 47 L 40 43 L 42 44 L 44 49 L 45 55 L 41 70 L 39 77 L 36 80 L 32 81 L 28 78 L 26 75 L 26 71 L 27 65 L 23 70 L 22 75 L 23 81 L 27 85 L 35 87 L 41 85 L 46 80 L 54 70 L 60 55 L 66 70 L 74 80 L 79 85 L 85 87 L 93 85 L 97 81 L 98 75 L 97 70 L 93 65 L 94 71 L 94 75 L 92 78 L 88 81 L 84 80 L 81 77 L 79 70 L 75 55 L 76 49 L 78 44 L 80 43 L 81 47 L 84 52 L 90 53 L 96 52 L 100 47 L 101 40 L 100 34 L 99 30 L 97 27 L 93 24 L 95 29 L 96 35 L 95 43 L 92 46 L 89 44 L 88 41 L 89 37 L 89 32 L 87 26 L 85 23 L 79 21 L 71 23 L 67 28 L 63 33 L 60 40 L 57 33 L 53 28 L 49 23 L 41 21 z " />
|
||||
<path
|
||||
style="fill:#ffe082;fill-opacity:1"
|
||||
d="m 60,62 -2,8 -3,5 -3,4 -3,3 2,5 2,5 4,3 h 6 l 4,-3 2,-5 2,-5 -3,-3 -3,-4 -3,-5 z"
|
||||
id="path3"
|
||||
sodipodi:nodetypes="cccccccccccccccc" />
|
||||
<path
|
||||
style="fill:#ffe082;fill-opacity:1"
|
||||
d="m 79,49 -1,6 1,6 3,8 2,-4 1,-4 -1,-6 -3,-2 z"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<path
|
||||
style="fill:#ffe082;fill-opacity:1"
|
||||
d="m 41,49 1,6 -1,6 -3,8 -2,-4 -1,-4 1,-6 3,-2 z"
|
||||
id="path4-7"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
86
www/asset/behemoth_dusk.svg
Normal file
86
www/asset/behemoth_dusk.svg
Normal file
@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="120"
|
||||
height="120"
|
||||
viewBox="0 0 120 120"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
|
||||
sodipodi:docname="behemoth_dusk.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#111111"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="1"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:zoom="6.9591091"
|
||||
inkscape:cx="32.259876"
|
||||
inkscape:cy="64.088663"
|
||||
inkscape:window-width="2588"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="1257"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="layer1">
|
||||
<inkscape:grid
|
||||
id="grid1"
|
||||
units="px"
|
||||
originx="0"
|
||||
originy="0"
|
||||
spacingx="1"
|
||||
spacingy="1"
|
||||
empcolor="#0099e5"
|
||||
empopacity="0.30196078"
|
||||
color="#0099e5"
|
||||
opacity="0.14901961"
|
||||
empspacing="5"
|
||||
dotted="false"
|
||||
gridanglex="30"
|
||||
gridanglez="30"
|
||||
visible="true" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#f6a1bd;fill-opacity:1;stroke-width:0.707108"
|
||||
id="rect2-4-8-6"
|
||||
width="60"
|
||||
height="5"
|
||||
x="30"
|
||||
y="105" />
|
||||
<path
|
||||
id="path1"
|
||||
style="fill:#f6a1bd;fill-opacity:1"
|
||||
d="M 41 21 L 35 23 L 33 26 L 31 32 L 31 37 L 32 41 L 31 44 L 28 46 L 25 43 L 24 35 L 25 29 L 27 24 L 23 27 L 21 30 L 20 34 L 19 40 L 20 47 L 24 52 L 30 53 L 36 52 L 39 47 L 40 43 L 42 44 L 44 49 L 45 55 L 41 70 L 39 77 L 36 80 L 32 81 L 28 78 L 26 75 L 26 71 L 27 65 L 23 70 L 22 75 L 23 81 L 27 85 L 35 87 L 41 85 L 46 80 L 54 70 L 60 55 L 66 70 L 74 80 L 79 85 L 85 87 L 93 85 L 97 81 L 98 75 L 97 70 L 93 65 L 94 71 L 94 75 L 92 78 L 88 81 L 84 80 L 81 77 L 79 70 L 75 55 L 76 49 L 78 44 L 80 43 L 81 47 L 84 52 L 90 53 L 96 52 L 100 47 L 101 40 L 100 34 L 99 30 L 97 27 L 93 24 L 95 29 L 96 35 L 95 43 L 92 46 L 89 44 L 88 41 L 89 37 L 89 32 L 87 26 L 85 23 L 79 21 L 71 23 L 67 28 L 63 33 L 60 40 L 57 33 L 53 28 L 49 23 L 41 21 z " />
|
||||
<path
|
||||
style="fill:#f6a1bd;fill-opacity:1"
|
||||
d="m 60,62 -2,8 -3,5 -3,4 -3,3 2,5 2,5 4,3 h 6 l 4,-3 2,-5 2,-5 -3,-3 -3,-4 -3,-5 z"
|
||||
id="path3"
|
||||
sodipodi:nodetypes="cccccccccccccccc" />
|
||||
<path
|
||||
style="fill:#f6a1bd;fill-opacity:1"
|
||||
d="m 79,49 -1,6 1,6 3,8 2,-4 1,-4 -1,-6 -3,-2 z"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<path
|
||||
style="fill:#f6a1bd;fill-opacity:1"
|
||||
d="m 41,49 1,6 -1,6 -3,8 -2,-4 -1,-4 1,-6 3,-2 z"
|
||||
id="path4-7"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
@ -24,9 +24,9 @@
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:zoom="19.683333"
|
||||
inkscape:cx="67.392042"
|
||||
inkscape:cy="82.049112"
|
||||
inkscape:zoom="9.8416665"
|
||||
inkscape:cx="63.759527"
|
||||
inkscape:cy="60.355632"
|
||||
inkscape:window-width="2588"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="1257"
|
||||
@ -65,7 +65,7 @@
|
||||
y="105" />
|
||||
<path
|
||||
style="fill:#ffe082;fill-opacity:1"
|
||||
d="m 40,90 5,-25 v -5 l -5,5 -5,10 5,5 -5,5 -5,-10 5,-15 2,-5 2,-4 -4,-1 h -5 l -5,5 -10,-5 v -5 l 2,-4 -1,-6 v -4 l 2,4 2,3 5,-8 v -5 l 5,5 5,-5 5,5 15,5 h 30 l 10,5 5,14 2,9 -2,-1 -1,-2 -1,5 -3,8 v 7 l -1,10 h -6 l 1,-10 -1,-6 -5,-1 -2,7 -3,10 h -5 l 1,-2 2,-8 V 75 L 73,69 67,65 H 55 l -5,5 -5,20 z"
|
||||
d="m 40,90 5,-25 v -5 l -5,5 -5,10 5,5 -5,5 -5,-10 5,-15 2,-5 2,-4 -4,-1 h -5 l -5,5 -10,-5 v -5 l 2,-4 -1,-6 v -4 l 2,4 2,3 5,-8 v -5 l 5,5 5,-5 5,5 15,5 h 30 l 10,5 5,14 2,9 -2,-1 -1,-2 -1,5 -3,8 v 7 l -1,10 h -6 l 1,-10 -1,-6 -4,-5 -3,11 -3,10 h -5 l 1,-2 2,-8 V 75 L 73,69 67,65 H 55 l -5,5 -5,20 z"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
|
||||
</g>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
@ -24,9 +24,9 @@
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:zoom="19.683333"
|
||||
inkscape:cx="67.392042"
|
||||
inkscape:cy="81.998308"
|
||||
inkscape:zoom="9.8416665"
|
||||
inkscape:cx="63.759527"
|
||||
inkscape:cy="60.355632"
|
||||
inkscape:window-width="2588"
|
||||
inkscape:window-height="1368"
|
||||
inkscape:window-x="1257"
|
||||
@ -65,7 +65,7 @@
|
||||
y="105" />
|
||||
<path
|
||||
style="fill:#f6a1bd;fill-opacity:1"
|
||||
d="m 40,90 5,-25 v -5 l -5,5 -5,10 5,5 -5,5 -5,-10 5,-15 2,-5 2,-4 -4,-1 h -5 l -5,5 -10,-5 v -5 l 2,-4 -1,-6 v -4 l 2,4 2,3 5,-8 v -5 l 5,5 5,-5 5,5 15,5 h 30 l 10,5 5,14 2,9 -2,-1 -1,-2 -1,5 -3,8 v 7 l -1,10 h -6 l 1,-10 -1,-6 -5,-1 -2,7 -3,10 h -5 l 1,-2 2,-8 V 75 L 73,69 67,65 H 55 l -5,5 -5,20 z"
|
||||
d="m 40,90 5,-25 v -5 l -5,5 -5,10 5,5 -5,5 -5,-10 5,-15 2,-5 2,-4 -4,-1 h -5 l -5,5 -10,-5 v -5 l 2,-4 -1,-6 v -4 l 2,4 2,3 5,-8 v -5 l 5,5 5,-5 5,5 15,5 h 30 l 10,5 5,14 2,9 -2,-1 -1,-2 -1,5 -3,8 v 7 l -1,10 h -6 l 1,-10 -1,-6 -4,-5 -3,11 -3,10 h -5 l 1,-2 2,-8 V 75 L 73,69 67,65 H 55 l -5,5 -5,20 z"
|
||||
id="path4"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
|
||||
</g>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
@ -4,14 +4,14 @@ let GAME_DATA = null;
|
||||
GAME.Board = class {
|
||||
constructor() {
|
||||
this.tiles = [ ]; for(let i = 0; i < 61; ++i) { this.tiles.push(new GAME.Tile(i)); }
|
||||
this.pieces = [ ]; for(let i = 0; i < 38; ++i) { this.pieces.push(null); }
|
||||
this.pieces = [ ]; for(let i = 0; i < GAME.Const.Count.Pieces; ++i) { this.pieces.push(null); }
|
||||
this.columns = [ ]; for(let i = 0; i < 9; ++i) { this.columns.push(new GAME.Column()); }
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.pieces = [ ]; for(let i = 0; i < 38; ++i) { this.pieces.push(null); }
|
||||
this.pieces = [ ]; for(let i = 0; i < GAME.Const.Count.Pieces; ++i) { this.pieces.push(null); }
|
||||
|
||||
// Describe Dawn layout
|
||||
let layout = [
|
||||
@ -37,7 +37,9 @@ GAME.Board = class {
|
||||
{ piece:GAME.Const.PieceId.Tower, hex:new MATH.Vec2(3, 0) },
|
||||
{ piece:GAME.Const.PieceId.Tower, hex:new MATH.Vec2(5, 1) },
|
||||
|
||||
{ piece:GAME.Const.PieceId.Dragon, hex:new MATH.Vec2(4, 1) },
|
||||
{ piece:GAME.Const.PieceId.Dragon, hex:new MATH.Vec2(4, 2) },
|
||||
{ piece:GAME.Const.PieceId.Behemoth, hex:new MATH.Vec2(4, 1) },
|
||||
|
||||
{ piece:GAME.Const.PieceId.Omen, hex:new MATH.Vec2(4, 0) },
|
||||
];
|
||||
|
||||
@ -79,7 +81,7 @@ GAME.Board = class {
|
||||
|
||||
GAME.Pool = class {
|
||||
constructor() {
|
||||
this.pieces = [ ]; for(let i = 0; i < 6; ++i) { this.pieces.push(1); }
|
||||
this.pieces = [ ]; for(let i = 0; i < 7; ++i) { this.pieces.push(0); }
|
||||
}
|
||||
};
|
||||
|
||||
@ -224,7 +226,7 @@ GAME.Game = class {
|
||||
else { this.board.columns[hex.x].extent[1] = Math.min(hex.y, this.board.columns[hex.x].extent[1]); }
|
||||
|
||||
// Get threatened tiles.
|
||||
for(let movement of this.movement_tiles_ext(piece, piece.tile)) {
|
||||
for(let movement of this.movement_tiles(piece, piece.tile)) {
|
||||
if(movement.threat) {
|
||||
this.board.tiles[movement.tile].threaten[piece.player] = true;
|
||||
}
|
||||
@ -244,16 +246,19 @@ GAME.Game = class {
|
||||
// Search for valid board moves.
|
||||
for(let piece of this.board.pieces) {
|
||||
if(piece !== null && piece.player == (this.turn & 1)) {
|
||||
moves += this.movement_tiles(piece, piece.tile).length;
|
||||
for(let move of this.movement_tiles(piece, piece.tile)) {
|
||||
if(move.valid) { moves += 1; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Search for valid pool placements.
|
||||
for(let i = 0; i < 6; ++i) {
|
||||
moves += this.placement_tiles(i, (this.turn & 1)).length;
|
||||
for(let i = 0; i < this.pools[0].length; ++i) {
|
||||
for(let move of this.placement_tiles(i, (this.turn & 1))) {
|
||||
if(move.valid) { moves += 1; }
|
||||
}
|
||||
}
|
||||
|
||||
console.log("moves " + moves);
|
||||
if(moves == 0) { this.state.checkmate = true; }
|
||||
}
|
||||
}
|
||||
@ -298,7 +303,6 @@ GAME.Game = class {
|
||||
|
||||
// Add captured piece to pool and destroy.
|
||||
else {
|
||||
console.log(piece.player);
|
||||
this.pools[piece.player].pieces[target.piece] += 1;
|
||||
this.board.pieces[target_id] = null;
|
||||
}
|
||||
@ -321,6 +325,7 @@ GAME.Game = class {
|
||||
player,
|
||||
play.to
|
||||
);
|
||||
this.pools[this.turn & 1].pieces[play.from] -= 1;
|
||||
}
|
||||
|
||||
this.turn++;
|
||||
@ -332,17 +337,6 @@ GAME.Game = class {
|
||||
}
|
||||
|
||||
movement_tiles(piece, tile) {
|
||||
let tiles = this.movement_tiles_ext(piece, tile);
|
||||
let result = [ ];
|
||||
|
||||
for(let movement in tiles) {
|
||||
if(movement.valid) { result.push(movement); }
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
movement_tiles_ext(piece, tile) {
|
||||
let tiles = [ ];
|
||||
let moves = piece.moves();
|
||||
let hex = this.board.tiles[tile].hex;
|
||||
@ -382,13 +376,15 @@ GAME.Game = class {
|
||||
|
||||
let result = valid;
|
||||
|
||||
if(piece.player == (this.turn & 1) && this.state.check && !tile_data.checking) {
|
||||
if(piece.player == (this.turn & 1)
|
||||
&& this.state.check && !tile_data.checking
|
||||
&& piece.piece != GAME.Const.PieceId.Omen) {
|
||||
result = false;
|
||||
}
|
||||
|
||||
// King may not move onto threatened tile.
|
||||
if(piece.piece == GAME.Const.PieceId.Omen && tile_data.threaten[+(!piece.player)]) {
|
||||
valid = false;
|
||||
result = false;
|
||||
}
|
||||
|
||||
// Handle occupied tile.
|
||||
@ -449,17 +445,6 @@ GAME.Game = class {
|
||||
}
|
||||
|
||||
placement_tiles(piece_id, player) {
|
||||
let tiles = this.placement_tiles_ext(piece_id, player);
|
||||
let result = [ ];
|
||||
|
||||
for(let movement in tiles) {
|
||||
if(movement.valid) { result.push(movement); }
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
placement_tiles_ext(piece_id, player) {
|
||||
let tiles = [ ];
|
||||
let piece = new GAME.Piece(piece_id, player);
|
||||
|
||||
@ -491,7 +476,7 @@ GAME.Game = class {
|
||||
|
||||
// Check if position puts king in check.
|
||||
let checking = false;
|
||||
let movements = this.movement_tiles_ext(piece, i);
|
||||
let movements = this.movement_tiles(piece, i);
|
||||
for(let movement of movements) {
|
||||
if(movement.check) {
|
||||
checking = true;
|
||||
@ -565,7 +550,12 @@ GAME.Const = {
|
||||
Tower: 3,
|
||||
Castle: 4,
|
||||
Dragon: 5,
|
||||
Omen: 6,
|
||||
Behemoth: 6,
|
||||
Omen: 7,
|
||||
},
|
||||
|
||||
Count: {
|
||||
Pieces:40,
|
||||
},
|
||||
|
||||
Piece: [
|
||||
@ -693,6 +683,29 @@ GAME.Const = {
|
||||
.add_stride(10)
|
||||
.add_stride(11),
|
||||
),
|
||||
new GAME.GamePiece(
|
||||
"Behemoth",
|
||||
new GAME.PieceMovement()
|
||||
.add_stride(0)
|
||||
.add_stride(1)
|
||||
.add_stride(2)
|
||||
.add_stride(3)
|
||||
.add_stride(4)
|
||||
.add_stride(5),
|
||||
new GAME.PieceMovement()
|
||||
.add_stride(0)
|
||||
.add_stride(1)
|
||||
.add_stride(2)
|
||||
.add_stride(3)
|
||||
.add_stride(4)
|
||||
.add_stride(5)
|
||||
.add(6)
|
||||
.add(7)
|
||||
.add(8)
|
||||
.add(9)
|
||||
.add(10)
|
||||
.add(11)
|
||||
),
|
||||
new GAME.GamePiece(
|
||||
"Omen",
|
||||
new GAME.PieceMovement()
|
||||
|
@ -15,6 +15,7 @@ GAME_ASSET.Image = {
|
||||
[ GAME_ASSET.load_image("asset/tower_dawn.svg"), GAME_ASSET.load_image("asset/tower_dusk.svg") ],
|
||||
[ GAME_ASSET.load_image("asset/castle_dawn.svg"), GAME_ASSET.load_image("asset/castle_dusk.svg") ],
|
||||
[ GAME_ASSET.load_image("asset/dragon_dawn.svg"), GAME_ASSET.load_image("asset/dragon_dusk.svg") ],
|
||||
[ GAME_ASSET.load_image("asset/behemoth_dawn.svg"), GAME_ASSET.load_image("asset/behemoth_dusk.svg") ],
|
||||
[ GAME_ASSET.load_image("asset/omen_dawn.svg"), GAME_ASSET.load_image("asset/omen_dusk.svg") ],
|
||||
],
|
||||
};
|
||||
|
@ -63,12 +63,12 @@ const INTERFACE = {
|
||||
if(piece_id !== null) {
|
||||
let piece = GAME_DATA.board.pieces[piece_id];
|
||||
player = piece.player;
|
||||
movements = GAME_DATA.movement_tiles_ext(piece, selection.tile);
|
||||
movements = GAME_DATA.movement_tiles(piece, selection.tile);
|
||||
}
|
||||
} else {
|
||||
player = Math.floor(selection.tile / 6);
|
||||
player = Math.floor(selection.tile / 7);
|
||||
player ^= (INTERFACE_DATA.player & 1) ^ INTERFACE_DATA.rotate;
|
||||
movements = GAME_DATA.placement_tiles_ext(selection.tile % 6, player);
|
||||
movements = GAME_DATA.placement_tiles(selection.tile % 7, player);
|
||||
}
|
||||
|
||||
if(movements !== null) {
|
||||
@ -154,11 +154,11 @@ const INTERFACE = {
|
||||
let rad_slope = 1 - (hex_slope * apo_offset);
|
||||
|
||||
let hx = kx + (rad_offset > rad_slope);
|
||||
let hy = Math.floor((ky - hx) / 2.0);
|
||||
let hy = Math.floor((ky + hx) / 2.0);
|
||||
|
||||
let hex = new MATH.Vec2(hx, hy);
|
||||
if(INTERFACE.Ui.pool_hex_is_valid(hex)) {
|
||||
let tile = (hx * 6) + hy;
|
||||
let tile = (hx * 7) + hy;
|
||||
INTERFACE_DATA.hover = new INTERFACE.Selection(1, tile, hex);
|
||||
}
|
||||
}
|
||||
@ -173,7 +173,7 @@ const INTERFACE = {
|
||||
if(redraw) { INTERFACE.draw(); }
|
||||
},
|
||||
|
||||
click(event) {
|
||||
click() {
|
||||
let initial_select = INTERFACE_DATA.select;
|
||||
|
||||
if(INTERFACE_DATA.hover !== null) {
|
||||
@ -190,7 +190,6 @@ const INTERFACE = {
|
||||
|
||||
if(is_valid) {
|
||||
let move_data = INTERFACE_DATA.select.source | (INTERFACE_DATA.select.tile << 1) | (INTERFACE_DATA.hover.tile << 7);
|
||||
console.log("SEND Play");
|
||||
MESSAGE_COMPOSE([
|
||||
PACK.u16(OpCode.GamePlay),
|
||||
PACK.u16(0),
|
||||
@ -205,10 +204,10 @@ const INTERFACE = {
|
||||
INTERFACE_DATA.select = INTERFACE_DATA.hover;
|
||||
}
|
||||
} else {
|
||||
let pool_player = Math.floor(INTERFACE_DATA.hover.tile / 6);
|
||||
let pool_player = Math.floor(INTERFACE_DATA.hover.tile / 7);
|
||||
pool_player ^= (INTERFACE_DATA.player & 1) ^ INTERFACE_DATA.rotate;
|
||||
|
||||
let pool_piece = INTERFACE_DATA.hover.tile % 6;
|
||||
let pool_piece = INTERFACE_DATA.hover.tile % 7;
|
||||
|
||||
if(GAME_DATA.pools[pool_player].pieces[pool_piece] > 0) {
|
||||
INTERFACE_DATA.select = INTERFACE_DATA.hover;
|
||||
@ -384,7 +383,7 @@ const INTERFACE = {
|
||||
}
|
||||
|
||||
// Draw player pool
|
||||
for(let i = 0; i < 6; ++i) {
|
||||
for(let i = 0; i < 7; ++i) {
|
||||
let is_hover = INTERFACE.Ui.tile_is_hover(1, i);
|
||||
let is_select = INTERFACE.Ui.tile_is_select(1, i);
|
||||
|
||||
@ -423,12 +422,12 @@ const INTERFACE = {
|
||||
}
|
||||
|
||||
// Draw opponent pool
|
||||
for(let i = 0; i < 6; ++i) {
|
||||
let is_hover = INTERFACE.Ui.tile_is_hover(1, 6 + i);
|
||||
let is_select = INTERFACE.Ui.tile_is_select(1, 6 + i);
|
||||
for(let i = 0; i < 7; ++i) {
|
||||
let is_hover = INTERFACE.Ui.tile_is_hover(1, 7 + i);
|
||||
let is_select = INTERFACE.Ui.tile_is_select(1, 7 + i);
|
||||
|
||||
let gui_x = basis_x + (radius * 15.5);
|
||||
let gui_y = basis_y - (8 - (2 * i)) * gui_scale;
|
||||
let gui_y = basis_y - (10 - (2 * i)) * gui_scale;
|
||||
|
||||
ctx.save();
|
||||
ctx.translate(gui_x, gui_y);
|
||||
@ -466,12 +465,12 @@ const INTERFACE = {
|
||||
|
||||
let handle_pos = [
|
||||
new MATH.Vec2(
|
||||
basis_x + (radius * 12),
|
||||
basis_y - (11 * gui_scale)
|
||||
basis_x + (radius * 10.5),
|
||||
basis_y - (11.5 * gui_scale)
|
||||
),
|
||||
new MATH.Vec2(
|
||||
basis_x + (radius * 12),
|
||||
basis_y + (3 * gui_scale)
|
||||
basis_x + (radius * 10.5),
|
||||
basis_y + (3.5 * gui_scale)
|
||||
),
|
||||
];
|
||||
|
||||
@ -505,11 +504,12 @@ const INTERFACE = {
|
||||
text = INTERFACE.Ui.hex_to_alnum(INTERFACE_DATA.hover.hex);
|
||||
let piece_id = GAME_DATA.board.tiles[INTERFACE_DATA.hover.tile].piece;
|
||||
if(piece_id !== null) {
|
||||
let piece_class = GAME_DATA.board.pieces[piece_id].piece;
|
||||
text += " " + GAME.Const.Piece[piece_class].name;
|
||||
let piece = GAME_DATA.board.pieces[piece_id];
|
||||
text += " " + GAME.Const.Piece[piece.piece].name;
|
||||
if(piece.promoted) { text += "+"; }
|
||||
}
|
||||
} else {
|
||||
text = " " + GAME.Const.Piece[INTERFACE_DATA.hover.tile % 6].name;
|
||||
text = " " + GAME.Const.Piece[INTERFACE_DATA.hover.tile % 7].name;
|
||||
}
|
||||
|
||||
ctx.fillStyle = INTERFACE.Color.Text;
|
||||
@ -637,7 +637,7 @@ const INTERFACE = {
|
||||
},
|
||||
|
||||
pool_hex_is_valid(hex) {
|
||||
return (hex.x >= 0 && hex.x < 2 && hex.y >= 0 && hex.y < 6);
|
||||
return (hex.x >= 0 && hex.x < 2 && hex.y >= 0 && hex.y < 7);
|
||||
},
|
||||
|
||||
hex_to_alnum(hex) {
|
||||
|
@ -243,6 +243,7 @@ function MESSAGE(event) {
|
||||
data.pool_dawn.push((dawn_pool_bits >> 9) & 0x3);
|
||||
data.pool_dawn.push((dawn_pool_bits >> 11) & 0x3);
|
||||
data.pool_dawn.push((dawn_pool_bits >> 13) & 0x1);
|
||||
data.pool_dawn.push((dawn_pool_bits >> 14) & 0x1);
|
||||
|
||||
// Dusk pool
|
||||
result = UNPACK.u16(bytes, index);
|
||||
@ -255,9 +256,10 @@ function MESSAGE(event) {
|
||||
data.pool_dusk.push((dusk_pool_bits >> 9) & 0x3);
|
||||
data.pool_dusk.push((dusk_pool_bits >> 11) & 0x3);
|
||||
data.pool_dusk.push((dusk_pool_bits >> 13) & 0x1);
|
||||
data.pool_dusk.push((dusk_pool_bits >> 14) & 0x1);
|
||||
|
||||
// Pieces
|
||||
for(let i = 0; i < 38; ++i) {
|
||||
for(let i = 0; i < GAME.Const.Count.Pieces; ++i) {
|
||||
result = UNPACK.u16(bytes, index);
|
||||
index = result.index;
|
||||
let piece_data = result.data;
|
||||
|
Loading…
x
Reference in New Issue
Block a user