about to start testing
This commit is contained in:
parent
556366bf8f
commit
ec3711e6bc
@ -13,9 +13,15 @@ cost system for items
|
|||||||
design / implement specs
|
design / implement specs
|
||||||
combo specs
|
combo specs
|
||||||
randomise skill speed
|
randomise skill speed
|
||||||
|
|
||||||
round system for games
|
round system for games
|
||||||
|
join instance
|
||||||
|
is pve?
|
||||||
add cryps to player
|
add cryps to player
|
||||||
find opponent or do pve
|
level bots every round
|
||||||
|
buy out vbox
|
||||||
|
find any combos
|
||||||
|
apply to random cryp
|
||||||
|
|
||||||
## SOON
|
## SOON
|
||||||
* clean up categories
|
* clean up categories
|
||||||
|
|||||||
@ -11,8 +11,8 @@ use account::Account;
|
|||||||
use rpc::{GameStateParams, GameSkillParams, GamePveParams};
|
use rpc::{GameStateParams, GameSkillParams, GamePveParams};
|
||||||
use cryp::{Cryp, cryp_get};
|
use cryp::{Cryp, cryp_get};
|
||||||
use skill::{Skill, Cast, ResolutionResult};
|
use skill::{Skill, Cast, ResolutionResult};
|
||||||
// use zone::{node_finish};
|
|
||||||
use mob::{generate_mob_team};
|
use mob::{generate_mob_team};
|
||||||
|
use player::{Player};
|
||||||
|
|
||||||
pub type Log = Vec<String>;
|
pub type Log = Vec<String>;
|
||||||
|
|
||||||
@ -721,6 +721,45 @@ pub fn game_pve(params: GamePveParams, tx: &mut Transaction, account: &Account)
|
|||||||
Ok(game)
|
Ok(game)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn game_instance_new(tx: &mut Transaction, player: Player, pve: bool) -> Result<Game, Error> {
|
||||||
|
// create the game
|
||||||
|
let mut game = Game::new();
|
||||||
|
let game_id = game.id;
|
||||||
|
|
||||||
|
game
|
||||||
|
.set_pve(pve)
|
||||||
|
.set_team_num(2)
|
||||||
|
.set_team_size(3)
|
||||||
|
.set_mode(GameMode::Pvp);
|
||||||
|
|
||||||
|
// create the initiators team
|
||||||
|
let mut team = Team::new(player.id);
|
||||||
|
team.set_cryps(player.cryps);
|
||||||
|
|
||||||
|
game.team_add(team)?;
|
||||||
|
|
||||||
|
// persist
|
||||||
|
game_write(&game, tx)?;
|
||||||
|
|
||||||
|
Ok(game)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn game_instance_join(tx: &mut Transaction, player: Player, game_id: Uuid) -> Result<Game, Error> {
|
||||||
|
let mut game = game_get(tx, game_id)?;
|
||||||
|
|
||||||
|
let mut team = Team::new(player.id);
|
||||||
|
team.set_cryps(player.cryps);
|
||||||
|
game.team_add(team)?;
|
||||||
|
|
||||||
|
if game.can_start() {
|
||||||
|
game.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
game_update(&game, tx)?;
|
||||||
|
|
||||||
|
Ok(game)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use game::*;
|
use game::*;
|
||||||
|
|||||||
@ -7,10 +7,14 @@ use postgres::transaction::Transaction;
|
|||||||
use failure::Error;
|
use failure::Error;
|
||||||
use failure::err_msg;
|
use failure::err_msg;
|
||||||
|
|
||||||
use rpc::{InstanceJoinParams};
|
use std::iter;
|
||||||
|
|
||||||
|
use rpc::{InstanceJoinParams, InstanceReadyParams};
|
||||||
use account::Account;
|
use account::Account;
|
||||||
use player::{Player, player_create};
|
use player::{Player, player_create, player_get};
|
||||||
use cryp::{Cryp, cryp_get};
|
use cryp::{Cryp, cryp_get};
|
||||||
|
use mob::{generate_mob};
|
||||||
|
use game::{Game, game_get, game_instance_new, game_instance_join};
|
||||||
|
|
||||||
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
|
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
|
||||||
enum InstancePhase {
|
enum InstancePhase {
|
||||||
@ -20,12 +24,21 @@ enum InstancePhase {
|
|||||||
Finished,
|
Finished,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
|
struct Round {
|
||||||
|
player_ids: Vec<Uuid>,
|
||||||
|
game_id: Option<Uuid>,
|
||||||
|
winner_id: Option<Uuid>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug,Clone,Serialize,Deserialize)]
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
pub struct Instance {
|
pub struct Instance {
|
||||||
id: Uuid,
|
id: Uuid,
|
||||||
players: Vec<Uuid>,
|
players: Vec<Player>,
|
||||||
phase: InstancePhase,
|
phase: InstancePhase,
|
||||||
|
rounds: Vec<Vec<Round>>,
|
||||||
open: bool,
|
open: bool,
|
||||||
|
pve: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Instance {
|
impl Instance {
|
||||||
@ -33,15 +46,112 @@ impl Instance {
|
|||||||
Instance {
|
Instance {
|
||||||
id: Uuid::new_v4(),
|
id: Uuid::new_v4(),
|
||||||
players: vec![],
|
players: vec![],
|
||||||
|
rounds: vec![],
|
||||||
phase: InstancePhase::Open,
|
phase: InstancePhase::Open,
|
||||||
open: true,
|
open: true,
|
||||||
|
pve: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_player(&mut self, player: &Player) -> &mut Instance {
|
fn add_bots(mut self) -> Instance {
|
||||||
self.players.push(player.id);
|
self.pve = true;
|
||||||
|
self.players = iter::repeat_with(|| {
|
||||||
|
let bot_id = Uuid::new_v4();
|
||||||
|
let cryps = iter::repeat_with(|| generate_mob(1).set_account(bot_id)).take(3).collect::<Vec<Cryp>>();
|
||||||
|
Player::new(bot_id, self.id, cryps).set_bot(true)
|
||||||
|
})
|
||||||
|
.take(15)
|
||||||
|
.collect::<Vec<Player>>();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_player(&mut self, player: Player) -> &mut Instance {
|
||||||
|
self.players.push(player);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_player(mut self, player: Player) -> Result<Instance, Error> {
|
||||||
|
let i = self.players
|
||||||
|
.iter()
|
||||||
|
.position(|p| p.id == player.id)
|
||||||
|
.ok_or(err_msg("player_id not found"))?;
|
||||||
|
|
||||||
|
self.players[i] = player;
|
||||||
|
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn can_start(&self) -> bool {
|
||||||
|
match self.pve {
|
||||||
|
true => self.players.len() == 16,
|
||||||
|
false => self.players.len() == 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn start(&mut self) -> &mut Instance {
|
||||||
|
// self.players.sort_unstable_by_key(|p| p.id);
|
||||||
|
self.generate_rounds();
|
||||||
|
self.phase = InstancePhase::Vbox;
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn progress(&mut self) -> &mut Instance {
|
||||||
|
if self.pve {
|
||||||
|
let r = self.rounds.len() - 1;
|
||||||
|
for mut round in self.rounds[r].iter_mut() {
|
||||||
|
if self.players
|
||||||
|
.iter()
|
||||||
|
.filter(|p| round.player_ids.contains(&p.id) && p.bot)
|
||||||
|
.count() == 2 {
|
||||||
|
// play bot game
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_rounds(&mut self) -> &mut Instance {
|
||||||
|
let round_num = self.rounds.len();
|
||||||
|
let mut matched_players = self.players
|
||||||
|
.iter()
|
||||||
|
.map(|p| p.id)
|
||||||
|
.collect::<Vec<Uuid>>();
|
||||||
|
|
||||||
|
if round_num > 0 {
|
||||||
|
matched_players.rotate_right(round_num);
|
||||||
|
matched_players.swap(0,1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// only set up for even player numbers atm
|
||||||
|
// no byes
|
||||||
|
let np = matched_players.len();
|
||||||
|
let current_round = matched_players[0..(np / 2) - 1]
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(i, id)| Round {
|
||||||
|
player_ids: vec![*id, matched_players[np - (i + 1)]],
|
||||||
|
game_id: None,
|
||||||
|
winner_id: None,
|
||||||
|
})
|
||||||
|
.collect::<Vec<Round>>();
|
||||||
|
|
||||||
|
self.rounds.push(current_round);
|
||||||
|
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_game_id(&self, player: &Player) -> Option<Uuid> {
|
||||||
|
let current_round = self.rounds.len() - 1;
|
||||||
|
|
||||||
|
let next_round = self.rounds[current_round]
|
||||||
|
.iter()
|
||||||
|
.find(|g| g.player_ids.contains(&player.id))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
return next_round.game_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn instance_create(instance: Instance, tx: &mut Transaction) -> Result<Instance, Error> {
|
pub fn instance_create(instance: Instance, tx: &mut Transaction) -> Result<Instance, Error> {
|
||||||
@ -125,9 +235,12 @@ pub fn instance_get_open(tx: &mut Transaction) -> Result<Instance, Error> {
|
|||||||
|
|
||||||
|
|
||||||
pub fn instance_join(params: InstanceJoinParams, tx: &mut Transaction, account: &Account) -> Result<Player, Error> {
|
pub fn instance_join(params: InstanceJoinParams, tx: &mut Transaction, account: &Account) -> Result<Player, Error> {
|
||||||
let mut instance = match instance_get_open(tx) {
|
let mut instance = match params.pve {
|
||||||
|
true => instance_create(Instance::new().add_bots(), tx)?,
|
||||||
|
false => match instance_get_open(tx) {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(_) => instance_create(Instance::new(), tx)?,
|
Err(_) => instance_create(Instance::new(), tx)?,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let cryps = params.cryp_ids
|
let cryps = params.cryp_ids
|
||||||
@ -140,10 +253,32 @@ pub fn instance_join(params: InstanceJoinParams, tx: &mut Transaction, account:
|
|||||||
}
|
}
|
||||||
|
|
||||||
let player = Player::new(account.id, instance.id, cryps);
|
let player = Player::new(account.id, instance.id, cryps);
|
||||||
instance.add_player(&player);
|
|
||||||
|
|
||||||
player_create(tx, &player, account)?;
|
player_create(tx, &player, account)?;
|
||||||
|
|
||||||
|
instance.add_player(player.clone());
|
||||||
instance_write(instance, tx)?;
|
instance_write(instance, tx)?;
|
||||||
|
|
||||||
return Ok(player);
|
return Ok(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn instance_ready(params: InstanceReadyParams, tx: &mut Transaction, account: &Account) -> Result<Game, Error> {
|
||||||
|
let player = player_get(tx, account.id, params.instance_id)?;
|
||||||
|
|
||||||
|
let instance = instance_get(tx, params.instance_id)?
|
||||||
|
.update_player(player.clone())?;
|
||||||
|
|
||||||
|
let game_id = instance.next_game_id(&player);
|
||||||
|
|
||||||
|
let game = match game_id {
|
||||||
|
Some(id) => game_instance_join(tx, player, id)?,
|
||||||
|
None => {
|
||||||
|
let game = game_instance_new(tx, player, instance.pve)?;
|
||||||
|
// instance.
|
||||||
|
game
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
instance_write(instance, tx)?;
|
||||||
|
|
||||||
|
return Ok(game);
|
||||||
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ use cryp::{Cryp};
|
|||||||
use game::{Team, GameMode};
|
use game::{Team, GameMode};
|
||||||
use skill::{Skill};
|
use skill::{Skill};
|
||||||
|
|
||||||
fn generate_mob(lvl: u8) -> Cryp {
|
pub fn generate_mob(lvl: u8) -> Cryp {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
|
|
||||||
let name: String = iter::repeat(())
|
let name: String = iter::repeat(())
|
||||||
|
|||||||
@ -27,6 +27,7 @@ pub struct Player {
|
|||||||
pub vbox: Vbox,
|
pub vbox: Vbox,
|
||||||
pub score: Score,
|
pub score: Score,
|
||||||
pub cryps: Vec<Cryp>,
|
pub cryps: Vec<Cryp>,
|
||||||
|
pub bot: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Player {
|
impl Player {
|
||||||
@ -38,8 +39,14 @@ impl Player {
|
|||||||
vbox: Vbox::new(account, instance),
|
vbox: Vbox::new(account, instance),
|
||||||
score: Score { wins: 0, losses: 0 },
|
score: Score { wins: 0, losses: 0 },
|
||||||
cryps,
|
cryps,
|
||||||
|
bot: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_bot(mut self, bot: bool) -> Player {
|
||||||
|
self.bot = bot;
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn player_get(tx: &mut Transaction, account_id: Uuid, instance_id: Uuid) -> Result<Player, Error> {
|
pub fn player_get(tx: &mut Transaction, account_id: Uuid, instance_id: Uuid) -> Result<Player, Error> {
|
||||||
|
|||||||
@ -15,14 +15,14 @@ use failure::Error;
|
|||||||
use failure::err_msg;
|
use failure::err_msg;
|
||||||
|
|
||||||
use net::Db;
|
use net::Db;
|
||||||
use cryp::{Cryp, cryp_spawn, cryp_learn};
|
use cryp::{Cryp, cryp_spawn};
|
||||||
use game::{Game, game_state, game_pve, game_skill};
|
use game::{Game, game_state, game_pve, game_skill};
|
||||||
use account::{Account, account_create, account_login, account_from_token, account_cryps, account_players};
|
use account::{Account, account_create, account_login, account_from_token, account_cryps, account_players};
|
||||||
use skill::{Skill};
|
use skill::{Skill};
|
||||||
// use zone::{Zone, zone_create, zone_join, zone_close};
|
// use zone::{Zone, zone_create, zone_join, zone_close};
|
||||||
use spec::{Spec};
|
use spec::{Spec};
|
||||||
use player::{player_state, player_create, player_cryps_set, Player};
|
use player::{player_state, player_create, player_cryps_set, Player};
|
||||||
use instance::{instance_join};
|
use instance::{instance_join, instance_ready};
|
||||||
use vbox::{vbox_accept, vbox_apply, vbox_discard, vbox_combine, vbox_drop};
|
use vbox::{vbox_accept, vbox_apply, vbox_discard, vbox_combine, vbox_drop};
|
||||||
|
|
||||||
pub struct Rpc;
|
pub struct Rpc;
|
||||||
@ -188,13 +188,13 @@ impl Rpc {
|
|||||||
let account = account_create(AccountCreateParams { name: acc_name, password: "grepgrepgrep".to_string() }, tx)?;
|
let account = account_create(AccountCreateParams { name: acc_name, password: "grepgrepgrep".to_string() }, tx)?;
|
||||||
|
|
||||||
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
||||||
let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
||||||
|
|
||||||
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
||||||
let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
||||||
|
|
||||||
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect();
|
||||||
let cryp = cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
cryp_spawn(CrypSpawnParams { name }, tx, &account)?;
|
||||||
|
|
||||||
let player = Player::new(account.id, Uuid::nil(), vec![]);
|
let player = Player::new(account.id, Uuid::nil(), vec![]);
|
||||||
player_create(tx, &player, &account)?;
|
player_create(tx, &player, &account)?;
|
||||||
@ -273,6 +273,18 @@ impl Rpc {
|
|||||||
return Ok(response);
|
return Ok(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn instance_ready(data: Vec<u8>, tx: &mut Transaction, account: Account, _client: &mut WebSocket<TcpStream>) -> Result<RpcResponse, Error> {
|
||||||
|
let msg = from_slice::<InstanceReadyMsg>(&data).or(Err(err_msg("invalid params")))?;
|
||||||
|
|
||||||
|
let response = RpcResponse {
|
||||||
|
method: "instance_state".to_string(),
|
||||||
|
params: RpcResult::GameState(instance_ready(msg.params, tx, &account)?)
|
||||||
|
};
|
||||||
|
|
||||||
|
return Ok(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn player_state(data: Vec<u8>, tx: &mut Transaction, account: Account, _client: &mut WebSocket<TcpStream>) -> Result<RpcResponse, Error> {
|
fn player_state(data: Vec<u8>, tx: &mut Transaction, account: Account, _client: &mut WebSocket<TcpStream>) -> Result<RpcResponse, Error> {
|
||||||
let msg = from_slice::<PlayerStateMsg>(&data).or(Err(err_msg("invalid params")))?;
|
let msg = from_slice::<PlayerStateMsg>(&data).or(Err(err_msg("invalid params")))?;
|
||||||
|
|
||||||
@ -538,6 +550,18 @@ struct InstanceJoinMsg {
|
|||||||
#[derive(Debug,Clone,Serialize,Deserialize)]
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
pub struct InstanceJoinParams {
|
pub struct InstanceJoinParams {
|
||||||
pub cryp_ids: Vec<Uuid>,
|
pub cryp_ids: Vec<Uuid>,
|
||||||
|
pub pve: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
|
struct InstanceReadyMsg {
|
||||||
|
method: String,
|
||||||
|
params: InstanceReadyParams,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
|
pub struct InstanceReadyParams {
|
||||||
|
pub instance_id: Uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug,Clone,Serialize,Deserialize)]
|
#[derive(Debug,Clone,Serialize,Deserialize)]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user