rpc battle cmd

This commit is contained in:
ntr 2018-09-23 14:44:31 +10:00
parent 3478d98c82
commit f825b26b37
5 changed files with 120 additions and 27 deletions

View File

@ -1,4 +1,6 @@
* Battling * Battling
* Levelling
* Global rolls
* Logins ✔️ * Logins ✔️
* Cryp Ownership ✔ * Cryp Ownership ✔
* Matchmaking * Matchmaking

View File

@ -1,5 +1,5 @@
// use uuid::Uuid; // use uuid::Uuid;
use rand::prelude::*; // use rand::prelude::*;
use cryp::Cryp; use cryp::Cryp;
@ -12,10 +12,10 @@ use cryp::Cryp;
// } // }
// } // }
#[derive(Debug)] #[derive(Debug,Clone,Serialize,Deserialize)]
pub struct Battle { pub struct Battle {
a: Cryp, pub a: Cryp,
b: Cryp, pub b: Cryp,
} }
impl Battle { impl Battle {
@ -31,6 +31,10 @@ impl Battle {
} }
pub fn next(&mut self) -> &mut Battle { pub fn next(&mut self) -> &mut Battle {
if self.finished() {
panic!("{:?} is finished", self);
}
let a_turn = self.a.turn(); let a_turn = self.a.turn();
let b_turn = self.b.turn(); let b_turn = self.b.turn();

View File

@ -1,4 +1,14 @@
use rand::prelude::*; use rand::prelude::*;
use serde_cbor::{from_slice};
// Db Commons
use failure::Error;
use failure::err_msg;
use net::Db;
use account::Account;
use rpc::{CombatPveParams};
use cryp::Cryp; use cryp::Cryp;
use battle::Battle; use battle::Battle;
use skill::Skill; use skill::Skill;
@ -10,26 +20,26 @@ struct Encounter {
} }
pub fn battle(a: &Cryp, b: &Cryp) -> Battle { pub fn battle_resolve(a: &Cryp, b: &Cryp) -> Battle {
let mut battle = Battle::new(a, b); let mut battle = Battle::new(a, b);
loop { loop {
battle.next(); battle.next();
if battle.finished() { if battle.finished() {
break battle break battle
}
} }
}
} }
fn pve(plr: Cryp) -> Encounter { fn pve_completion(plr: Cryp) -> Encounter {
let mut rng = thread_rng(); let mut rng = thread_rng();
let mob_lvl: u8 = rng.gen_range(1, plr.lvl); let mob_lvl: u8 = rng.gen_range(1, plr.lvl);
let mob = Cryp::new() let mob = Cryp::new()
.named("bamboo basher".to_string()) .named(&"bamboo basher".to_string())
.level(mob_lvl) .level(mob_lvl)
.create(); .create();
let outcome = battle(&plr, &mob); let outcome = battle_resolve(&plr, &mob);
let success = match outcome.winner() { let success = match outcome.winner() {
Some(c) => c.id == plr.id, Some(c) => c.id == plr.id,
@ -43,9 +53,9 @@ fn pve(plr: Cryp) -> Encounter {
}; };
} }
pub fn levelling(mut c: Cryp) -> Cryp { pub fn keep_levelling(mut c: Cryp) -> Cryp {
loop { loop {
let enc = pve(c); let enc = pve_completion(c);
c = enc.player; c = enc.player;
if !enc.success { if !enc.success {
@ -66,19 +76,54 @@ pub fn levelling(mut c: Cryp) -> Cryp {
} }
} }
fn generate_mob(plr: &Cryp) -> Cryp {
let mut rng = thread_rng();
let mob_lvl: u8 = rng.gen_range(1, plr.lvl);
return Cryp::new()
.named(&"bamboo basher".to_string())
.level(mob_lvl)
.create();
}
pub fn pve(params: CombatPveParams, db: Db, account: Account) -> Result<Battle, Error> {
let query = "
SELECT *
FROM cryps
WHERE id = $1;
";
let result = db
.query(query, &[&params.id])?;
let returned = match result.iter().next() {
Some(row) => row,
None => return Err(err_msg("cryp not found")),
};
// tells from_slice to cast into a cryp
let cryp_bytes: Vec<u8> = returned.get("data");
let plr: Cryp = from_slice::<Cryp>(&cryp_bytes)?;
let mob = generate_mob(&plr);
return Ok(Battle::new(&plr, &mob));
}
pub fn test_battle() { pub fn test_battle() {
let mut a = Cryp::new() let a = Cryp::new()
.named("pronounced \"creeep\"".to_string()) .named(&"pronounced \"creeep\"".to_string())
.level(8) .level(8)
.learn(Skill::Stoney) .learn(Skill::Stoney)
.create(); .create();
let b = Cryp::new() let b = Cryp::new()
.named("lemongrass tea".to_string()) .named(&"lemongrass tea".to_string())
.level(8) .level(8)
.create(); .create();
let outcome = battle(&a, &b); let outcome = battle_resolve(&a, &b);
match outcome.winner() { match outcome.winner() {
Some(w) => println!("{:?} is the winner with {:?} hp remaining", w.name, w.hp), Some(w) => println!("{:?} is the winner with {:?} hp remaining", w.name, w.hp),
@ -91,19 +136,32 @@ pub fn test_battle() {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use combat::*;
#[test] #[test]
fn pve_test() { fn pve_completion_test() {
let player = Cryp::new() let player = Cryp::new()
.named("ca phe sua da".to_string()) .named(&"ca phe sua da".to_string())
.level(2) .level(2)
.create(); .create();
levelling(player); keep_levelling(player);
return; return;
} }
// #[test]
// fn pve_test() {
// let name = "ca phe sua da".to_string();
// let player = Cryp::new()
// .named(&name)
// .level(2)
// .create();
// let _battle = pve(player);
// return;
// }
#[test] #[test]
fn battle_test() { fn battle_test() {
test_battle(); test_battle();

View File

@ -108,7 +108,7 @@ impl Cryp {
}; };
} }
pub fn named(mut self, name: String) -> Cryp { pub fn named(mut self, name: &String) -> Cryp {
self.name = name.clone(); self.name = name.clone();
self self
} }
@ -190,7 +190,7 @@ impl Cryp {
pub fn spawn(params: CrypSpawnParams, db: Db, account: Account) -> Result<Cryp, Error> { pub fn spawn(params: CrypSpawnParams, db: Db, account: Account) -> Result<Cryp, Error> {
let cryp = Cryp::new() let cryp = Cryp::new()
.named(params.name) .named(&params.name)
.level(1) .level(1)
.set_account(account.id) .set_account(account.id)
.create(); .create();
@ -226,7 +226,7 @@ mod tests {
#[test] #[test]
fn create_cryp_test() { fn create_cryp_test() {
let max_level = Cryp::new() let max_level = Cryp::new()
.named("hatchling".to_string()) .named(&"hatchling".to_string())
.level(64) .level(64)
.learn(Skill::Stoney) .learn(Skill::Stoney)
.create(); .create();

View File

@ -1,10 +1,13 @@
use ws::{Message}; use ws::{Message};
use serde_cbor::{from_slice}; use serde_cbor::{from_slice};
use uuid::Uuid;
use failure::Error; use failure::Error;
use failure::err_msg; use failure::err_msg;
use net::Db; use net::Db;
use cryp::{Cryp, spawn}; use cryp::{Cryp, spawn};
use battle::{Battle};
use combat::{pve};
use account::{Account, create, login, from_token}; use account::{Account, create, login, from_token};
pub struct Rpc; pub struct Rpc;
@ -42,6 +45,20 @@ impl Rpc {
Err(_e) => Err(err_msg("invalid params")), Err(_e) => Err(err_msg("invalid params")),
} }
}, },
"combat_pve" => {
match from_slice::<CombatPveMsg>(&data) {
Ok(v) => {
match account {
Some(u) => Ok(RpcResponse {
method: v.method,
params: RpcResult::Pve(pve(v.params, db, u)?)
}),
None => Err(err_msg("auth required")),
}
}
Err(_e) => Err(err_msg("invalid params")),
}
},
"account_create" => { "account_create" => {
match from_slice::<AccountCreateMsg>(&data) { match from_slice::<AccountCreateMsg>(&data) {
Ok(v) => Ok(RpcResponse { Ok(v) => Ok(RpcResponse {
@ -79,6 +96,7 @@ pub struct RpcResponse {
pub enum RpcResult { pub enum RpcResult {
SpawnCryp(Cryp), SpawnCryp(Cryp),
Account(Account), Account(Account),
Pve(Battle),
} }
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
@ -98,6 +116,17 @@ pub struct CrypSpawnParams {
pub name: String, pub name: String,
} }
#[derive(Debug,Clone,Serialize,Deserialize)]
struct CombatPveMsg {
method: String,
params: CombatPveParams,
}
#[derive(Debug,Clone,Serialize,Deserialize)]
pub struct CombatPveParams {
pub id: Uuid,
}
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
struct AccountCreateMsg { struct AccountCreateMsg {
method: String, method: String,