win conditions and some other stuff

This commit is contained in:
ntr 2019-05-29 15:57:04 +10:00
parent cbe83b3a1e
commit 7f422ce8e8
9 changed files with 49 additions and 30 deletions

View File

@ -46,9 +46,8 @@
* eth adapter * eth adapter
* pay for rerolls * pay for rerolls
* remove test variants of skills * warden
* set upkeep_at timestamp for games and instances
* itemise all skills and warn on some
## SOON ## SOON
@ -63,6 +62,11 @@
* skills * skills
* private fields for opponents * private fields for opponents
* matchmaking
* elo
* password on MM game to prevent direct joins
* flavour text * flavour text
* chat wheel trash talk * chat wheel trash talk
* KO animations and trash talk * KO animations and trash talk

View File

@ -18,14 +18,5 @@
</head> </head>
<body> <body>
</body> </body>
<!-- <script> <script src="./index.js"></script>
// Check that service workers are registered
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('./service.worker.js');
});
}
</script>
--> <script src="./index.js"></script>
</html> </html>

View File

@ -83,7 +83,7 @@ function GamePanel(props) {
return null; return null;
} }
const zero = Date.parse(game.phase_end) - (1000 * 60); const zero = Date.parse(game.phase_start);
const now = Date.now(); const now = Date.now();
const end = Date.parse(game.phase_end); const end = Date.parse(game.phase_end);
const timerPct = ((now - zero) / (end - zero) * 100); const timerPct = ((now - zero) / (end - zero) * 100);

View File

@ -117,7 +117,9 @@ function InfoComponent(args) {
function Combos() { function Combos() {
if (!player) return false; if (!player) return false;
if (!(combiner.every(u => u === null))) {
// show recipe for what's in combiner
if (combiner.some(u => u !== null)) {
const filteredCombos = itemInfo.combos const filteredCombos = itemInfo.combos
.filter(combo => combiner.every(u => u === null .filter(combo => combiner.every(u => u === null
|| combo.components.includes(player.vbox.bound[u]))); || combo.components.includes(player.vbox.bound[u])));
@ -136,6 +138,7 @@ function InfoComponent(args) {
); );
} }
if (!info) return false;
const vboxCombos = itemInfo.combos.filter(c => c.components.includes(info)); const vboxCombos = itemInfo.combos.filter(c => c.components.includes(info));
if (vboxCombos.length > 6) return false; if (vboxCombos.length > 6) return false;
return ( return (

View File

@ -64,7 +64,7 @@ function Instance(args) {
: null; : null;
// TIMER // TIMER
const zero = Date.parse(instance.phase_end) - (1000 * 120); const zero = Date.parse(instance.phase_start);
const now = Date.now(); const now = Date.now();
const end = Date.parse(instance.phase_end); const end = Date.parse(instance.phase_end);
const timerPct = ((now - zero) / (end - zero) * 100); const timerPct = ((now - zero) / (end - zero) * 100);

View File

@ -64,8 +64,6 @@ function Equipment(props) {
const isSkill = fullInfo && fullInfo.skill; const isSkill = fullInfo && fullInfo.skill;
const isSpec = fullInfo && fullInfo.spec; const isSpec = fullInfo && fullInfo.spec;
console.log('isSkill', isSkill, fullInfo);
function skillClick(e, i) { function skillClick(e, i) {
if (itemUnequip && activeConstruct) return false; if (itemUnequip && activeConstruct) return false;
// const value = vbox.bound[i]; // const value = vbox.bound[i];

View File

@ -1,6 +1,5 @@
module.exports = { module.exports = {
TIMES: { TIMES: {
RESOLUTION_TIME_MS: 1000,
START_SKILL: 700, START_SKILL: 700,
END_SKILL: 700, END_SKILL: 700,
POST_SKILL: 1000, POST_SKILL: 1000,

View File

@ -162,13 +162,14 @@ impl Game {
return self.finish(); return self.finish();
} }
self.skill_phase_start() self.skill_phase_start(0)
} }
fn skill_phase_start(mut self) -> Game { fn skill_phase_start(mut self, num_resolutions: usize) -> Game {
let phase_add_time_ms = 60000 + num_resolutions * 2500;
self.phase_start = Utc::now(); self.phase_start = Utc::now();
self.phase_end = Utc::now() self.phase_end = Utc::now()
.checked_add_signed(Duration::seconds(60)) .checked_add_signed(Duration::milliseconds(phase_add_time_ms as i64))
.expect("could not set phase end"); .expect("could not set phase end");
for player in self.players.iter_mut() { for player in self.players.iter_mut() {
@ -426,12 +427,14 @@ impl Game {
// temp vec of this round's resolving skills // temp vec of this round's resolving skills
// because need to check cooldown use before pushing them into the complete list // because need to check cooldown use before pushing them into the complete list
let mut casts = vec![]; let mut casts = vec![];
let mut turn_events = 0;
while let Some(cast) = self.stack.pop() { while let Some(cast) = self.stack.pop() {
// info!("{:} casts ", cast); // info!("{:} casts ", cast);
let mut resolutions = resolution_steps(&cast, &mut self); let mut resolutions = resolution_steps(&cast, &mut self);
resolutions.reverse(); resolutions.reverse();
turn_events += resolutions.len();
while let Some(resolution) = resolutions.pop() { while let Some(resolution) = resolutions.pop() {
self.log_resolution(cast.speed, &resolution); self.log_resolution(cast.speed, &resolution);
// the results go into the resolutions // the results go into the resolutions
@ -455,7 +458,7 @@ impl Game {
return self.finish() return self.finish()
} }
self.skill_phase_start() self.skill_phase_start(turn_events)
} }
fn progress_durations(&mut self, resolved: &Vec<Cast>) -> &mut Game { fn progress_durations(&mut self, resolved: &Vec<Cast>) -> &mut Game {

View File

@ -30,6 +30,11 @@ enum InstancePhase {
Finished, Finished,
} }
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]
enum Format {
Standard,
}
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
struct Round { struct Round {
player_ids: Vec<Uuid>, player_ids: Vec<Uuid>,
@ -48,7 +53,10 @@ pub struct Instance {
max_rounds: usize, max_rounds: usize,
password: Option<String>, password: Option<String>,
pub name: String, pub name: String,
format: Format,
phase_end: DateTime<Utc>, phase_end: DateTime<Utc>,
phase_start: DateTime<Utc>,
} }
impl Instance { impl Instance {
@ -64,6 +72,9 @@ impl Instance {
name: String::new(), name: String::new(),
password: None, password: None,
phase_end: Utc::now(), phase_end: Utc::now(),
phase_start: Utc::now(),
format: Format::Standard,
} }
} }
@ -78,7 +89,10 @@ impl Instance {
max_rounds: 1, max_rounds: 1,
name: "Global Matchmaking".to_string(), name: "Global Matchmaking".to_string(),
password: None, password: None,
phase_start: Utc::now(),
phase_end: Utc::now(), phase_end: Utc::now(),
format: Format::Standard,
} }
} }
@ -273,16 +287,17 @@ impl Instance {
} }
fn next_round(&mut self) -> &mut Instance { fn next_round(&mut self) -> &mut Instance {
self.phase = InstancePhase::InProgress; if self.win_condition() {
self.phase_end = Utc::now()
.checked_add_signed(Duration::seconds(15000))
.expect("could not set phase end");
if self.rounds.len() >= self.max_rounds {
return self.finish(); return self.finish();
} }
self.phase = InstancePhase::InProgress;
self.phase_start = Utc::now();
self.phase_end = Utc::now()
.checked_add_signed(Duration::seconds(120))
.expect("could not set phase end");
self.players.iter_mut().for_each(|p| { self.players.iter_mut().for_each(|p| {
p.set_ready(false); p.set_ready(false);
p.vbox.fill(); p.vbox.fill();
@ -294,6 +309,12 @@ impl Instance {
self self
} }
fn win_condition(&self) -> bool {
match self.format {
Format::Standard => self.players.iter().any(|p| p.score.wins > 2)
}
}
fn finish(&mut self) -> &mut Instance { fn finish(&mut self) -> &mut Instance {
self.phase = InstancePhase::Finished; self.phase = InstancePhase::Finished;
self self