From 1bfa06c01512a4ca0251c0509376b4cbfd3b90d4 Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 15:10:20 +1000 Subject: [PATCH 01/18] animate opponent cryps again --- client/assets/styles/instance.css | 4 ++++ client/src/components/game.component.jsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/assets/styles/instance.css b/client/assets/styles/instance.css index 54e1e149..1e8e33c1 100644 --- a/client/assets/styles/instance.css +++ b/client/assets/styles/instance.css @@ -22,6 +22,10 @@ .instance .info table td svg { height: 50%; } + + .instance svg { + height: 1.5em; + } } .instance .top { diff --git a/client/src/components/game.component.jsx b/client/src/components/game.component.jsx index 51a33c98..fd83df43 100644 --- a/client/src/components/game.component.jsx +++ b/client/src/components/game.component.jsx @@ -163,7 +163,7 @@ function GamePanel(props) {
selectSkillTarget(cryp.id)} > - {crypAvatar(cryp.name)} + {crypAvatar(cryp.name, cryp.id)} {combatTextEl} {anim}
From 16c95bfa18fe7507a593e726feabb14e8f18f765 Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 16:36:04 +1000 Subject: [PATCH 02/18] fix animations --- client/src/utils.jsx | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/client/src/utils.jsx b/client/src/utils.jsx index b280b134..f8547ac0 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -56,8 +56,34 @@ function requestAvatar(name) { .then(svg => svg); } +const animations = {}; +function animateCryp(id) { + if (animations[id]) return false; + animations[id] = true; + const target = document.getElementById(id); + return anime({ + targets: target, + translateX: () => anime.random(-20, 20), + translateY: () => anime.random(0, -40), + rotate: () => anime.random(-15, 15), + duration: () => anime.random(2000, 5000), + delay: () => anime.random(0, 2000), + direction: 'alternate', + easing: 'linear', + loop: true, + complete: () => animations[id] = false, + }); +} + +function clearAnimation(id) { + animations[id] = false; +} + function crypAvatar(name, id) { - useEffect(() => animateCryp(id)); + useEffect(() => { + animateCryp(id); + return () => clearAnimation(id); + }); return ( anime.random(-20, 20), - translateY: () => anime.random(0, -40), - rotate: () => anime.random(-15, 15), - duration: () => anime.random(2000, 5000), - delay: () => anime.random(0, 2000), - direction: 'alternate', - easing: 'linear', - loop: true, - }); -} - module.exports = { animateCryp, stringSort, From 1ba6a9695bb2b47cc3c33106ed4a97c649b4717e Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 16:40:47 +1000 Subject: [PATCH 03/18] durations --- client/src/utils.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/utils.jsx b/client/src/utils.jsx index f8547ac0..add2dddf 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -60,14 +60,14 @@ const animations = {}; function animateCryp(id) { if (animations[id]) return false; animations[id] = true; + const duration = anime.random(2000, 20000); const target = document.getElementById(id); return anime({ targets: target, translateX: () => anime.random(-20, 20), translateY: () => anime.random(0, -40), rotate: () => anime.random(-15, 15), - duration: () => anime.random(2000, 5000), - delay: () => anime.random(0, 2000), + duration, direction: 'alternate', easing: 'linear', loop: true, From 88e81e1ebd47ced355707cec98c97a49d17283cd Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 17:09:02 +1000 Subject: [PATCH 04/18] mobile styles --- client/assets/styles/instance.mobile.css | 41 ++++++++++++------------ client/src/utils.jsx | 13 +++++--- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/client/assets/styles/instance.mobile.css b/client/assets/styles/instance.mobile.css index 0a747e94..20c9c54d 100644 --- a/client/assets/styles/instance.mobile.css +++ b/client/assets/styles/instance.mobile.css @@ -1,20 +1,20 @@ @media (max-height: 800px), (max-width: 1000px) { .instance { display: grid; - grid-template-columns: 100%; - grid-template-rows: repeat(4, min-content); + grid-template-columns: 1fr; + grid-template-rows: min-content, min-content, min-content, 1fr; grid-template-areas: "top" "controls" - "first" - "second" + "mvbox" + "mcryps" } /* Default view */ .instance .equip { display: none; } .instance .info { display: none; } .instance .cryp-list { display: none; } .vbox { - grid-area: first; + grid-area: mvbox; display: grid; grid-template-rows: min-content min-content min-content; grid-template-columns: 1fr; @@ -47,7 +47,7 @@ #toggle-vbox:checked ~ .vbox { display: none; } #toggle-vbox:checked ~ .equip { display: initial; - grid-area: first; + grid-area: mvbox; } #toggle-vbox:checked ~ .highlight { @@ -55,14 +55,13 @@ } #toggle-vbox:checked ~ .cryp-list { - grid-area: second; - display: flex; + grid-area: mcryps; + display: grid; justify-content: center; - flex-flow: row wrap; - flex: 1; - width: 100%; - } + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr 1fr; + } #toggle-vbox { display: none; } @@ -76,15 +75,20 @@ margin-right: 0.5em; } + .instance .cryp-list { + display: grid; + grid-auto-columns: 1fr 1fr; + } + .cryp-list .skills { flex-flow: row; align-items: stretch; } .instance-cryp { - flex: 1; + grid-row: 2; display: grid; - grid-template-rows: min-content min-content; + grid-template-rows: min-content 1fr; grid-template-areas: "name " "avatar "; @@ -95,9 +99,6 @@ transition-delay: 0; transition-timing-function: ease; } - .instance-cryp img { - width: 35px; - } .instance-cryp .skills { display: none; @@ -113,10 +114,10 @@ .instance-cryp-active { - flex: 1; - order: -1; + grid-row: 1; + grid-column: 1 / 3; display: grid; - grid-template-rows: min-content min-content min-content min-content min-content; + grid-template-rows: min-content min-content min-content 1fr min-content; grid-template-areas: "name " "skills " diff --git a/client/src/utils.jsx b/client/src/utils.jsx index add2dddf..91677b88 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -80,10 +80,10 @@ function clearAnimation(id) { } function crypAvatar(name, id) { - useEffect(() => { - animateCryp(id); - return () => clearAnimation(id); - }); + // useEffect(() => { + // animateCryp(id); + // return () => clearAnimation(id); + // }); return ( animateCryp(id)); + // useEffect(() => { + // animateCryp(id); + // return () => clearAnimation(id); + // }); return (
Date: Fri, 24 May 2019 17:14:12 +1000 Subject: [PATCH 05/18] oops --- client/assets/styles/instance.mobile.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/client/assets/styles/instance.mobile.css b/client/assets/styles/instance.mobile.css index 20c9c54d..01e81aaa 100644 --- a/client/assets/styles/instance.mobile.css +++ b/client/assets/styles/instance.mobile.css @@ -75,11 +75,6 @@ margin-right: 0.5em; } - .instance .cryp-list { - display: grid; - grid-auto-columns: 1fr 1fr; - } - .cryp-list .skills { flex-flow: row; align-items: stretch; From 437e7795ebe944d5859cfbc551c115dc24de71b9 Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 17:17:02 +1000 Subject: [PATCH 06/18] noice --- client/assets/styles/instance.css | 2 +- client/assets/styles/instance.mobile.css | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/assets/styles/instance.css b/client/assets/styles/instance.css index 1e8e33c1..c06a63cd 100644 --- a/client/assets/styles/instance.css +++ b/client/assets/styles/instance.css @@ -177,7 +177,7 @@ transition-timing-function: ease; */} -.instance-cryp:first-child { +.instance-cryp:first-child, .instance-cryp-active:first-child { margin-left: 0; border-left-width: 1px; } diff --git a/client/assets/styles/instance.mobile.css b/client/assets/styles/instance.mobile.css index 01e81aaa..e8a7ff34 100644 --- a/client/assets/styles/instance.mobile.css +++ b/client/assets/styles/instance.mobile.css @@ -6,15 +6,15 @@ grid-template-areas: "top" "controls" - "mvbox" - "mcryps" + "vbox" + "cryps" } /* Default view */ .instance .equip { display: none; } .instance .info { display: none; } .instance .cryp-list { display: none; } .vbox { - grid-area: mvbox; + grid-area: vbox; display: grid; grid-template-rows: min-content min-content min-content; grid-template-columns: 1fr; @@ -47,7 +47,7 @@ #toggle-vbox:checked ~ .vbox { display: none; } #toggle-vbox:checked ~ .equip { display: initial; - grid-area: mvbox; + grid-area: vbox; } #toggle-vbox:checked ~ .highlight { @@ -55,7 +55,7 @@ } #toggle-vbox:checked ~ .cryp-list { - grid-area: mcryps; + grid-area: cryps; display: grid; justify-content: center; From cd6649f6ad9ce7606da15785c6e712edc51cb33a Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 17:39:26 +1000 Subject: [PATCH 07/18] put anims back --- client/assets/styles/game.css | 5 ----- client/assets/styles/styles.mobile.css | 15 ++++++--------- client/src/utils.jsx | 16 ++++++++-------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/client/assets/styles/game.css b/client/assets/styles/game.css index db7391a4..aa313bdb 100644 --- a/client/assets/styles/game.css +++ b/client/assets/styles/game.css @@ -113,10 +113,6 @@ } @media (max-width: 1500px) { - .game { - font-size: 12pt; - } - .game-cryp figure { padding: 0 0.25em; } @@ -171,7 +167,6 @@ .game-cryp button[disabled], .game-cryp button[disabled]:hover { color: #333333; - font-size: 14pt; text-decoration: line-through } diff --git a/client/assets/styles/styles.mobile.css b/client/assets/styles/styles.mobile.css index 39707849..ededd5af 100644 --- a/client/assets/styles/styles.mobile.css +++ b/client/assets/styles/styles.mobile.css @@ -1,6 +1,6 @@ @media (max-height: 800px), (max-width: 1000px) { #cryps { - font-size: 12pt; + font-size: 8pt; padding: 0; grid-template-columns: min-content 1fr; grid-template-rows: min-content 1fr; @@ -9,6 +9,10 @@ "main main"; } + button { + font-size: 8pt; + } + table td { height: 2.5em; } @@ -27,15 +31,8 @@ -moz-transition: all 0.5s ease-in-out; -o-transition: all 0.5s ease-in-out; transition: all 0.5s ease-in-out; + } - } -/* main { - -webkit-transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; - } -*/ #toggle-nav { display: none; } #toggle-nav-label { diff --git a/client/src/utils.jsx b/client/src/utils.jsx index 91677b88..fb5feb6d 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -80,10 +80,10 @@ function clearAnimation(id) { } function crypAvatar(name, id) { - // useEffect(() => { - // animateCryp(id); - // return () => clearAnimation(id); - // }); + useEffect(() => { + animateCryp(id); + return () => clearAnimation(id); + }); return ( { - // animateCryp(id); - // return () => clearAnimation(id); - // }); + useEffect(() => { + animateCryp(id); + return () => clearAnimation(id); + }); return (
Date: Fri, 24 May 2019 17:46:38 +1000 Subject: [PATCH 08/18] remove demo --- client/src/components/login.component.jsx | 7 +---- client/src/components/login.container.jsx | 5 +--- client/src/socket.jsx | 5 ---- server/src/account.rs | 4 +++ server/src/rpc.rs | 34 +++++++++++------------ 5 files changed, 22 insertions(+), 33 deletions(-) diff --git a/client/src/components/login.component.jsx b/client/src/components/login.component.jsx index 9603f3dc..67b89685 100644 --- a/client/src/components/login.component.jsx +++ b/client/src/components/login.component.jsx @@ -1,7 +1,7 @@ // eslint-disable-next-line const preact = require('preact'); -function renderLogin({ submitLogin, submitRegister, submitDemo }) { +function renderLogin({ submitLogin, submitRegister }) { const details = { name: '', password: '', @@ -31,11 +31,6 @@ function renderLogin({ submitLogin, submitRegister, submitDemo }) { onClick={() => submitRegister(details.name, details.password)}> Register -
); } diff --git a/client/src/components/login.container.jsx b/client/src/components/login.container.jsx index 8d8a75e1..7aac33d9 100644 --- a/client/src/components/login.container.jsx +++ b/client/src/components/login.container.jsx @@ -11,10 +11,7 @@ const addState = connect( function submitRegister(name, password) { return ws.sendAccountCreate(name, password); } - function submitDemo() { - return ws.sendAccountDemo(); - } - return { account: state.account, submitLogin, submitRegister, submitDemo }; + return { account: state.account, submitLogin, submitRegister }; }, ); diff --git a/client/src/socket.jsx b/client/src/socket.jsx index 13388178..d45be58a 100644 --- a/client/src/socket.jsx +++ b/client/src/socket.jsx @@ -47,10 +47,6 @@ function createSocket(events) { send({ method: 'account_create', params: { name, password } }); } - function sendAccountDemo() { - send({ method: 'account_demo', params: {} }); - } - function sendAccountCryps() { send({ method: 'account_cryps', params: {} }); } @@ -342,7 +338,6 @@ function createSocket(events) { clearInstanceStateTimeout, sendAccountLogin, sendAccountCreate, - sendAccountDemo, sendAccountCryps, sendAccountInstances, sendAccountZone, diff --git a/server/src/account.rs b/server/src/account.rs index 6eb9b1a1..d2cadc7f 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -65,6 +65,10 @@ pub fn account_create(params: AccountCreateParams, tx: &mut Transaction) -> Resu return Err(err_msg("password must be at least 12 characters")); } + if params.password != "grepgrepgrep" { + return Err(err_msg("https://discord.gg/YJJgurM")); + } + if params.name.len() == 0 { return Err(err_msg("account name not supplied")); } diff --git a/server/src/rpc.rs b/server/src/rpc.rs index 0d7f0ad1..6b38c53a 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -57,7 +57,6 @@ impl Rpc { match v.method.as_ref() { "account_create" => (), "account_login" => (), - "account_demo" => (), _ => match account { Some(_) => (), None => return Err(err_msg("auth required")), @@ -70,7 +69,6 @@ impl Rpc { // no auth methods "account_create" => Rpc::account_create(data, &mut tx, client), "account_login" => Rpc::account_login(data, &mut tx, client), - "account_demo" => Rpc::account_demo(data, &mut tx, client), // auth methods "account_cryps" => Rpc::account_cryps(data, &mut tx, account.unwrap(), client), @@ -204,29 +202,29 @@ impl Rpc { } } - fn account_demo(_data: Vec, tx: &mut Transaction, _client: &mut WebSocket) -> Result { - let mut rng = thread_rng(); + // fn account_demo(_data: Vec, tx: &mut Transaction, _client: &mut WebSocket) -> Result { + // let mut rng = thread_rng(); - let acc_name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); + // let acc_name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); - 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(); - cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); + // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; - let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); - cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); + // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; - let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); - cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); + // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; - let res = RpcResponse { - method: "account_create".to_string(), - params: RpcResult::Account(account), - }; + // let res = RpcResponse { + // method: "account_create".to_string(), + // params: RpcResult::Account(account), + // }; - return Ok(res); - } + // return Ok(res); + // } fn account_cryps(_data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { From 01b93f7e03d84e3f41e69b96708bb9b68ea6756c Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 17:54:14 +1000 Subject: [PATCH 09/18] dev hax --- client/src/components/nav.jsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/client/src/components/nav.jsx b/client/src/components/nav.jsx index b6bdfb03..3fabe5f2 100644 --- a/client/src/components/nav.jsx +++ b/client/src/components/nav.jsx @@ -1,9 +1,10 @@ const { connect } = require('react-redux'); const preact = require('preact'); +const { Fragment } = require('preact'); const actions = require('../actions'); -const testGame = require('./../test.game'); -const testInstance = require('./../test.instance'); +const testGame = process.NODE_ENV === 'develop' && require('./../test.game'); +const testInstance = process.NODE_ENV === 'develop' && require('./../test.instance'); const addState = connect( function receiveState(state) { @@ -84,6 +85,14 @@ function Nav(args) { return ; }); + const haxSection = process.NODE_ENV === 'development' + ? ( +

Hax

+ + +
) + : null; + return ( ); } From 4800609df788ca8a5eb8bbdc7072144f328e32e6 Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 24 May 2019 17:56:55 +1000 Subject: [PATCH 10/18] node env stuff --- client/src/components/nav.jsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/src/components/nav.jsx b/client/src/components/nav.jsx index 3fabe5f2..c06bc2d6 100644 --- a/client/src/components/nav.jsx +++ b/client/src/components/nav.jsx @@ -3,8 +3,10 @@ const preact = require('preact'); const { Fragment } = require('preact'); const actions = require('../actions'); -const testGame = process.NODE_ENV === 'develop' && require('./../test.game'); -const testInstance = process.NODE_ENV === 'develop' && require('./../test.instance'); +const testGame = process.env.NODE_ENV === 'development' && require('./../test.game'); +const testInstance = process.env.NODE_ENV === 'development' && require('./../test.instance'); + +console.log('env', process.env.NODE_ENV); const addState = connect( function receiveState(state) { @@ -85,8 +87,9 @@ function Nav(args) { return ; }); - const haxSection = process.NODE_ENV === 'development' - ? ( + const haxSection = process.env.NODE_ENV === 'development' + ? ( +

Hax

From 760106e0e786c13e9a71f34ceef1f6afccc7489c Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 25 May 2019 15:20:38 +1000 Subject: [PATCH 11/18] bigtime renaming --- CHANGELOG.md | 4 +- COMBOS.md | 2 +- ECONOMY.md | 18 +- NODES.md | 2 +- README.md | 8 +- ROADMAP.md | 27 +- SPECS.md | 52 +-- WORKLOG.md | 6 +- client/assets/styles/game.css | 56 +-- client/assets/styles/instance.css | 52 +-- client/assets/styles/instance.mobile.css | 28 +- client/assets/styles/styles.css | 20 +- client/assets/styles/styles.mobile.css | 2 +- client/index.html | 4 +- client/manifest.webmanifest | 6 +- client/package.json | 2 +- client/src/actions.jsx | 8 +- client/src/app.jsx | 6 +- client/src/components/cryp.spawn.button.jsx | 6 +- client/src/components/cryp.spawn.container.js | 10 +- client/src/components/game.component.jsx | 50 +- client/src/components/game.container.jsx | 22 +- client/src/components/game.cryp.jsx | 44 +- client/src/components/header.component.jsx | 2 +- client/src/components/info.component.jsx | 8 +- client/src/components/instance.component.jsx | 4 +- .../src/components/instance.create.form.jsx | 6 +- client/src/components/instance.cryps.jsx | 90 ++-- client/src/components/instance.equip.jsx | 16 +- client/src/components/list.jsx | 4 +- client/src/components/menu.component.jsx | 42 +- client/src/components/menu.container.jsx | 20 +- client/src/components/nav.jsx | 10 +- client/src/components/skill.btn.jsx | 22 +- client/src/components/spawn.button.jsx | 4 +- client/src/components/targeting.arrows.jsx | 14 +- client/src/components/team.jsx | 48 +- client/src/constants.jsx | 12 +- client/src/events.jsx | 44 +- client/src/keyboard.jsx | 2 +- client/src/reducers.jsx | 6 +- client/src/socket.jsx | 72 +-- client/src/test.game.js | 30 +- client/src/test.instance.js | 32 +- client/src/utils.jsx | 56 +-- ops/cryps.gg.nginx.conf | 40 +- ops/init_db.sh | 8 +- ops/knexfile.js | 4 +- ops/migrations/20180916221309_cryps_table.js | 2 +- ops/package.json | 2 +- phaser-client/index.html | 2 +- phaser-client/index.js | 2 +- phaser-client/package.json | 2 +- phaser-client/src/events.js | 42 +- phaser-client/src/main.js | 4 +- phaser-client/src/scenes/combat.animations.js | 2 +- phaser-client/src/scenes/combat.cryps.js | 126 +++--- phaser-client/src/scenes/combat.hitbox.js | 20 +- phaser-client/src/scenes/combat.js | 8 +- .../src/scenes/combat.render.resolutions.js | 32 +- phaser-client/src/scenes/combat.skills.js | 68 +-- phaser-client/src/scenes/constants.js | 70 +-- phaser-client/src/scenes/cryps.js | 4 +- .../src/scenes/elements/combat.statbar.js | 34 +- phaser-client/src/scenes/game.list.js | 6 +- phaser-client/src/scenes/header.js | 2 +- phaser-client/src/scenes/home.cryps.js | 64 +-- phaser-client/src/scenes/home.js | 6 +- phaser-client/src/scenes/item.info.js | 10 +- phaser-client/src/scenes/item.list.js | 8 +- phaser-client/src/scenes/menu.cryps.list.js | 102 ++--- phaser-client/src/scenes/menu.js | 8 +- phaser-client/src/scenes/statsheet.js | 40 +- phaser-client/src/scenes/zones.js | 2 +- phaser-client/src/socket.js | 94 ++-- phaser-client/src/tutorial.js | 36 +- server/.env | 2 +- server/Cargo.toml | 4 +- server/src/account.rs | 26 +- server/src/cryp.rs | 230 +++++----- server/src/game.rs | 426 +++++++++--------- server/src/instance.rs | 56 +-- server/src/item.rs | 68 +-- server/src/main.rs | 6 +- server/src/mob.rs | 60 +-- server/src/player.rs | 128 +++--- server/src/rpc.rs | 114 ++--- server/src/skill.rs | 282 ++++++------ server/src/spec.rs | 18 +- server/src/vbox.rs | 6 +- server/src/zone.rs | 4 +- 91 files changed, 1643 insertions(+), 1616 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6598fa6d..5da7a676 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,8 @@ Added `Buff` as a skill *BALANCE* - purify - - 1 effect from all cryps at level 2 - - removes all effects from all cryps at l3 + - 1 effect from all constructs at level 2 + - removes all effects from all constructs at l3 - invert - fx for buffs when applied to enemies diff --git a/COMBOS.md b/COMBOS.md index 4cd2063f..d41124fc 100644 --- a/COMBOS.md +++ b/COMBOS.md @@ -5,7 +5,7 @@ specs [spec [bonus amount, [r g b]] # Playthrough -cryps join game +constructs join game stats randomised initial stash drops diff --git a/ECONOMY.md b/ECONOMY.md index cd15efb1..e40a894c 100644 --- a/ECONOMY.md +++ b/ECONOMY.md @@ -23,9 +23,9 @@ Base specs have a base 3 cost ### Actual Costs -- Costs increase as more of an item is used on cryps in the game +- Costs increase as more of an item is used on constructs in the game - The cost increases by the base cost for every 6 allocations of base item -- Allocation is based on all cryps in the game +- Allocation is based on all constructs in the game ### Example ### @@ -33,15 +33,15 @@ Round #1 All costs are base costs # Player #1 and Player #2 (They both bought the same things) -Cryp #1 Strike (Attack + RR), (2 + 1 + 1) = (4) cost -Cryp #1 Empower (Buff + RR), (2 + 1 + 1) = (4) cost -Cryp #3 Attack, 2 cost +Construct #1 Strike (Attack + RR), (2 + 1 + 1) = (4) cost +Construct #1 Empower (Buff + RR), (2 + 1 + 1) = (4) cost +Construct #3 Attack, 2 cost Total cost - 10 Round #2 -Items used on cryps include: +Items used on constructs include: Red x 8 Attack x 4 @@ -52,9 +52,9 @@ The costs of red for round #2 are now (1 + 1) = 2 If they were to buy the same skill setup it would be as follows: # Player #1 and Player #2 (They both bought the same things) -Cryp #1 Strike (Attack + RR), (2 + 2 + 2) = (6) cost -Cryp #1 Empower (Buff + RR), (2 + 2 + 2) = (6) cost -Cryp #3 Attack, 2 cost +Construct #1 Strike (Attack + RR), (2 + 2 + 2) = (6) cost +Construct #1 Empower (Buff + RR), (2 + 2 + 2) = (6) cost +Construct #3 Attack, 2 cost Total cost - 14 diff --git a/NODES.md b/NODES.md index 16042cab..076b466e 100644 --- a/NODES.md +++ b/NODES.md @@ -46,4 +46,4 @@ Rare `increased speed, increased cooldowns` - Increased stat - ??? Related Notables -# ??? Cryps need to have a minimum of X of the cryp stat to learn a skill # +# ??? Constructs need to have a minimum of X of the construct stat to learn a skill # diff --git a/README.md b/README.md index 74cb4925..96116cc9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cryps ("creeps") +# Constructs ("creeps") ## Combat @@ -30,7 +30,7 @@ resolve phase: | reduction | absorption? | durations | -## Cryp Alignments +## Construct Alignments Natural Selection ================ @@ -92,7 +92,7 @@ Path to Destruction Damage & Destruction ------------------------- -cryps walking the path to destruction have forsaken themselves in order to gain ruinous power. +constructs walking the path to destruction have forsaken themselves in order to gain ruinous power. no price is too high, they gladly harm themselves and allies to amplify the destruction they wreak on everything around them specialise in magical damage dealing @@ -124,7 +124,7 @@ Universal Chaos The only constant is change. ---------------------------- -Cryps aligning themselves with the forces of chaos believe that constant change is the only truth in the universe. +Constructs aligning themselves with the forces of chaos believe that constant change is the only truth in the universe. They harness its power to manipulate physical reality as well as control and disrupt the flow of battle. They blend between physical and astral forms, constantly shifting throughout time and space. diff --git a/ROADMAP.md b/ROADMAP.md index 2f0608eb..7f9ff085 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,7 +1,7 @@ ### Road Map ### -# NOW Phase 1 (Dev -> Alpha) +# NOW Phase 1 (Dev -> Alpha) Form company structure Brainstorm Names? @@ -22,7 +22,7 @@ Combat animations Make in game shop Payment processors / CC etc Handler for game purchases - MTX - Cryp Avatars + MTX - Construct Avatars MTX - Skill anims Setup company bank accounts @@ -32,7 +32,7 @@ Setup company bank accounts Player Events e.g. chatwheel Matchmaking + ELO / Leaderboard -Game skill private fields +Game skill private fields Refine artwork, icons, scaling etc Music @@ -41,4 +41,23 @@ Marketing materials Videos Twitch Advertisments? - Information \ No newline at end of file + Information + + + +# china shit +You need to read the details more carefully. Playsaurus messed up: + +1. They launched in China without registering a trademark + +2. A competitor registered the trademark after 3 months of their launch + +3. They continued to sell for 4 years under a name trademarked by another company, making $73,000+ yearly from that one country + +Now, they complain about it on Reddit, even though China is a 'First to File' company. + +The fault lies entirely with Playsaurus, nothing illegal occurred here. + +https://www.trademarknow.com/blog/first-to-file-versus-first... + +This situation could have occurred in many other countries - the difference is probably that the competitor is content to just sell in China, under a Chinese name, whereas products sold anywhere else would need to use the English name. \ No newline at end of file diff --git a/SPECS.md b/SPECS.md index 543247df..cd8d089f 100644 --- a/SPECS.md +++ b/SPECS.md @@ -4,16 +4,16 @@ Numbers are placeholder `Specs get a bonus dependent on the total of Red / Green / Blue in player skills & specs` # Example to meet 5 red gem bonus from skills only -In your player Cryp #1 has `Strike`, Cryp #2 has `Slay` and `Heal`, Cryp #3 has `Snare` +In your player Construct #1 has `Strike`, Construct #2 has `Slay` and `Heal`, Construct #3 has `Snare` - RR skill `Strike` contributes 2 red gems to the total red gems (2 total) - RG skill `Slay` contributes 1 red gem to the total red gems (3 total) - GG skill `Heal` contirubtes 0 red gems to the total red gems (3 total) - RR skill `Snare` contirubtes 2 red gems to the total red gems (5 total) -# Advanced specs also require a minimum number of Red / Green / Blue gems on the cryp to take effect +# Advanced specs also require a minimum number of Red / Green / Blue gems on the construct to take effect - Tier 1 Basic specs (Damage / Health / Defense) will have no requirements - Advanced specs will require a certain threshold of red / green / blue gems to be enabled - - Provided spec requirements are met, all specs will add gems to the cryp + - Provided spec requirements are met, all specs will add gems to the construct # Starting from scratch with a vbox @@ -26,9 +26,9 @@ In your player Cryp #1 has `Strike`, Cryp #2 has `Slay` and `Heal`, Cryp #3 has Combine 2 Red + 'Attack' -> Strike Combine 2 Red + 'Basic Damage Spec' -> Red Damage - Cryp #1 -> Give Strike & Red Damage Spec -> Strike + 1 x Red Damage Spec - Cryp #2 -> Give Attack -> Attack - Cryp #3 -> Give Stun -> Stun + Construct #1 -> Give Strike & Red Damage Spec -> Strike + 1 x Red Damage Spec + Construct #2 -> Give Attack -> Attack + Construct #3 -> Give Stun -> Stun Player Total (4 Red + 2 Basic gems) @@ -37,17 +37,17 @@ In your player Cryp #1 has `Strike`, Cryp #2 has `Slay` and `Heal`, Cryp #3 has - Buy 2 reds & 2 green & 2 blue (all available colour items) - Buy 2 Basic Damage Spec (item) - - Cryp #2 Unequip Attack + - Construct #2 Unequip Attack - Combine 2 Green + 'Attack' -> Heal - - Cryp #3 Unequip Stun + - Construct #3 Unequip Stun - Combine 2 Blue + 'Stun' -> Ruin - Combine 2 Red + 'Basic Damage Spec' -> Red Damage - Cryp #1 -> Give Red Damage items -> Strike + 2 x Red Damage Spec (6R) - Cryp #2 -> Give Heal item -> Heal (2G) - Cryp #3 -> Give Ruin item -> Ruin (2B) + Construct #1 -> Give Red Damage items -> Strike + 2 x Red Damage Spec (6R) + Construct #2 -> Give Heal item -> Heal (2G) + Construct #3 -> Give Ruin item -> Ruin (2B) ## Round 3 @@ -58,9 +58,9 @@ In your player Cryp #1 has `Strike`, Cryp #2 has `Slay` and `Heal`, Cryp #3 has - Combine 2 Red + 'Stun' -> Strangle - Combine 2 Red + 'Block' -> Parry - Cryp #1 -> Give 'Stun' & 'Strangle' -> Strike, Stun, Strangle + 2 x Red Damage Spec (10R) - Cryp #2 -> 'No change' -> Heal (2G) - Cryp #3 -> Give Attack item & 2 Basic Damage Spec -> Attack + Ruin + 2 x Basic Damage Spec (2B) + Construct #1 -> Give 'Stun' & 'Strangle' -> Strike, Stun, Strangle + 2 x Red Damage Spec (10R) + Construct #2 -> 'No change' -> Heal (2G) + Construct #3 -> Give Attack item & 2 Basic Damage Spec -> Attack + Ruin + 2 x Basic Damage Spec (2B) ## Round 4 @@ -70,18 +70,18 @@ In your player Cryp #1 has `Strike`, Cryp #2 has `Slay` and `Heal`, Cryp #3 has - Combine 2 Red + 'Attack' -> Strike - Combine 2 Red + 'Buff' -> Empower - - Cryp #1 Unequip 2 x Red Damage spec, Equip Empower -> Strike, Stun, Strangle, Empower (8R) + - Construct #1 Unequip 2 x Red Damage spec, Equip Empower -> Strike, Stun, Strangle, Empower (8R) - Combine 'Strike' + 2 x Red Damage spec -> 'Increased Strike Damage spec' - ### Note 'Increased Strike Damage spec' requires 8R on the cryp + ### Note 'Increased Strike Damage spec' requires 8R on the construct - Cryp #1 Equip Increased Strike Damage spec -> Strike, Stun, Strangle, Empower + Increased Strike Damage Spec (14R) - Cryp #2 -> 'No change' -> Heal - Cryp #3 -> 'No change' -> Attack + Ruin + 2 x Basic Damage Spec + Construct #1 Equip Increased Strike Damage spec -> Strike, Stun, Strangle, Empower + Increased Strike Damage Spec (14R) + Construct #2 -> 'No change' -> Heal + Construct #3 -> 'No change' -> Attack + Ruin + 2 x Basic Damage Spec ## Round 5 - We already lost cause we went all in on 1 red cryp like a noob + We already lost cause we went all in on 1 red construct like a noob ### Generic Specs @@ -96,7 +96,7 @@ Maximum 35% inc hp Maximum 50% inc speed # Basic Class Spec -`Base` -> +2 red, +2 green +2 blue gems on cryp +`Base` -> +2 red, +2 green +2 blue gems on construct # Basic Duration ### Increased Damage Combos ### @@ -182,32 +182,32 @@ Maximum +35% inc blue shield and 35% inc red shield ## Upgraded Attack Spec Combos # Increased Strike Damage (Combine Strike + Red Damage Spec x 2) -Cryp Requires `8 red gems` +Construct Requires `8 red gems` Adds `6 red gems` `Base` -> 15% increased strike damage `Player Bonus` 15 red gems -> +15% // 20 red gems -> +20% // 30 red gems -> +30% Maximum 80% increased strike damage # Improved Heal (Combine Heal + Healing Spec x 2) -Cryp Requires `8 green gems` +Construct Requires `8 green gems` `Base` -> 15% increased heal healing `Player Bonus` 15 green gems -> +15% // 20 green gems -> +20% // 30 green gems -> +30% Maximum 80% increased heal healing # Increased Blast Damage (Combine Blast + Blue Spec x 2) -Cryp Requires `8 blue gems` +Construct Requires `8 blue gems` `Base` -> 15% increased blast damage `Player Bonus` 15 blue gems -> +15% // 20 blue gems -> +20% // 30 blue gems -> +30% Maximum 80% increased blast damage # Increased Slay Damage (Combine Slay + Red Damage Spec + Healing Spec) -Cryp Requires `4 red 4 green gems` +Construct Requires `4 red 4 green gems` `Base` -> 15% increased slay damage `Player Bonus` (8R + 8G) gems -> +15% // (10R + 10G) gems -> +20% // (15R + 15G) gems -> +30% Maximum 80% increased slay damage # Increased Banish Damage (Combine Slay + Red Damage Spec + Blue Damage Spec) -Cryp Requires `4 red 4 blue gems` +Construct Requires `4 red 4 blue gems` `Base` -> 15% increased slay damage `Player Bonus` (8R + 8B) gems -> +15% // (10R + 10B) gems -> +20% // (15R + 15B) gems -> +30% Maximum 80% increased banish damage diff --git a/WORKLOG.md b/WORKLOG.md index 3204dd55..5f442b7e 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -24,8 +24,8 @@ Tidy edges on game UI blue + defensive green - purify - - 1 effect from all cryps at level 2 - - removes all effects from all cryps at l3 + - 1 effect from all constructs at level 2 + - removes all effects from all constructs at l3 - invert - fx for buffs when applied to enemies @@ -102,7 +102,7 @@ push events $$$ * Items * Colour scheme - * number of cryps + * number of constructs * Highlight (dota) colour * fx colours + styles diff --git a/client/assets/styles/game.css b/client/assets/styles/game.css index aa313bdb..70f8b403 100644 --- a/client/assets/styles/game.css +++ b/client/assets/styles/game.css @@ -36,7 +36,7 @@ } -.opponent .game-cryp { +.opponent .game-construct { align-items: flex-start; grid-template-rows: min-content min-content min-content 2fr; grid-template-columns: 1fr 1fr; @@ -47,12 +47,12 @@ "avatar target"; } -.opponent .game-cryp .name { +.opponent .game-construct .name { margin-bottom: 0; margin-top: 0.25em; } -.game-cryp { +.game-construct { display: grid; /*justify-items: center;*/ @@ -74,7 +74,7 @@ transition-timing-function: ease; } -.game-cryp .targeting { +.game-construct .targeting { grid-area: target; display: flex; flex-flow: column; @@ -84,36 +84,36 @@ white-space: nowrap; } -.game-cryp .img { +.game-construct .img { grid-area: avatar; } -.game-cryp .name { +.game-construct .name { width: 100%; margin-bottom: 0.25em; text-align: center; grid-area: name; } -.game-cryp .stats { +.game-construct .stats { grid-area: stats; display: flex; flex-flow: row; } -.game-cryp figure { +.game-construct figure { padding: 0 0.5em; display: flex; flex-flow: column; } -.game-cryp figcaption { +.game-construct figcaption { white-space: nowrap; font-size: 100%; } @media (max-width: 1500px) { - .game-cryp figure { + .game-construct figure { padding: 0 0.25em; } @@ -123,7 +123,7 @@ } */} -.game-cryp .skills { +.game-construct .skills { grid-area: skills; display: flex; flex-flow: column-reverse; @@ -131,13 +131,13 @@ } /*@media (max-width: 1000px) { - .game-cryp .skills { + .game-construct .skills { flex-flow: column; } } */ -.game-cryp .effects { +.game-construct .effects { grid-area: effects; font-size: 1.5em; white-space: nowrap; @@ -153,7 +153,7 @@ margin-right: 0.5em; } -.game-cryp button { +.game-construct button { color: #888; flex: 1 1 100%; padding: 0; @@ -161,35 +161,35 @@ border-width: 0px; } -.game-cryp button.active { +.game-construct button.active { color: whitesmoke; } -.game-cryp button[disabled], .game-cryp button[disabled]:hover { +.game-construct button[disabled], .game-construct button[disabled]:hover { color: #333333; text-decoration: line-through } -.game-cryp button:hover { +.game-construct button:hover { color: whitesmoke; } -.game-cryp.ko { +.game-construct.ko { animation: none; opacity: 0.35; filter: grayscale(100%); } -.game-cryp.ko button:hover { +.game-construct.ko button:hover { color: #333; } -.game-cryp.unfocus { +.game-construct.unfocus { opacity: 0.65; filter: blur(5px); } -.game-cryp.unfocus.ko { +.game-construct.unfocus.ko { filter: blur(5px) grayscale(100%); } @@ -202,18 +202,18 @@ left: 50%; } -CRYP DAMAGE +CONSTRUCT DAMAGE -.game-cryp.active-skill { +.game-construct.active-skill { filter: drop-shadow(0 0 0.2em silver); /*border-color: silver;*/ } -.game-cryp.red-damage { +.game-construct.red-damage { filter: drop-shadow(0 0 0.2em red); color: red; - /*ensure cryp doesn't get opacity lowered because of being KO before the KO animation*/ + /*ensure construct doesn't get opacity lowered because of being KO before the KO animation*/ opacity: 1; /*border-color: red;*/ @@ -232,7 +232,7 @@ CRYP DAMAGE /*border-top: 1px solid red;*/ } -.game-cryp.blue-damage { +.game-construct.blue-damage { filter: drop-shadow(0 0 0.2em blue); color: blue; opacity: 1; @@ -252,7 +252,7 @@ CRYP DAMAGE /*border-top: 1px solid blue;*/ } -.game-cryp.green-damage { +.game-construct.green-damage { filter: drop-shadow(0 0 0.2em green); color: green; opacity: 1; @@ -272,7 +272,7 @@ CRYP DAMAGE /*border-top: 1px solid green;*/ } -.game-cryp.purple-damage { +.game-construct.purple-damage { filter: drop-shadow(0 0 0.2em purple); color: purple; border-color: purple; diff --git a/client/assets/styles/instance.css b/client/assets/styles/instance.css index c06a63cd..7692b6ab 100644 --- a/client/assets/styles/instance.css +++ b/client/assets/styles/instance.css @@ -11,7 +11,7 @@ "top top info" "vbox vbox info" "equip equip info" - "cryps cryps info"; + "constructs constructs info"; } @media (max-width: 1920px) { @@ -33,7 +33,7 @@ } .instance .scoreboard { - grid-area: cryps; + grid-area: constructs; } .instance-ui-btn { @@ -60,8 +60,8 @@ margin-top: 1.5em; } -.instance .cryps { - grid-area: cryps; +.instance .constructs { + grid-area: constructs; } .instance .equip { @@ -148,16 +148,16 @@ cursor: pointer; } -/* CRYP LIST */ +/* CONSTRUCT LIST */ -.cryp-list { - grid-area: cryps; +.construct-list { + grid-area: constructs; display: grid; grid-template-columns: 1fr 1fr 1fr; } -.instance-cryp, .instance-cryp-active { +.instance-construct, .instance-construct-active { display: grid; grid-template-rows: min-content min-content min-content 1fr min-content; grid-template-areas: @@ -177,17 +177,17 @@ transition-timing-function: ease; */} -.instance-cryp:first-child, .instance-cryp-active:first-child { +.instance-construct:first-child, .instance-construct-active:first-child { margin-left: 0; border-left-width: 1px; } -.cryp-list .name { +.construct-list .name { grid-area: name; margin-bottom: 0.5em; } -.cryp-list .avatar { +.construct-list .avatar { grid-area: avatar; object-fit: contain; background-size: contain; @@ -196,28 +196,28 @@ pointer-events: none; } -.cryp-list .name { +.construct-list .name { text-align: center; } -.cryp-list .avatar figure { +.construct-list .avatar figure { margin: 0; height: 80%; text-align: center; box-sizing: border-box; } -.cryp-list .avatar figcaption { +.construct-list .avatar figcaption { font-size: 90%; } -.cryp-list .skills { +.construct-list .skills { grid-area: skills; display: flex; border-width: 0px; } -.cryp-list .skills button { +.construct-list .skills button { flex: 1; border-width: 0px; } @@ -236,7 +236,7 @@ } } */ -.cryp-list .specs { +.construct-list .specs { margin-top: 1em; grid-area: specs; display: flex; @@ -245,18 +245,18 @@ border-width: 0px; } -.cryp-list .specs figure { +.construct-list .specs figure { flex: 1; border: 0; align-items: center; text-align: center; } -.cryp-list .specs figcaption { +.construct-list .specs figcaption { font-size: 75%; } -.cryp-list .stats { +.construct-list .stats { grid-area: stats; display: grid; grid-template-rows: 1fr 3fr; @@ -267,11 +267,11 @@ border-width: 0px; } -.cryp-list .stats figcaption { +.construct-list .stats figcaption { font-size: 75%; } -.cryp-list .stats .icons { +.construct-list .stats .icons { grid-area: st; display: flex; flex-flow: row; @@ -289,25 +289,25 @@ fill: none; } -.cryp-list .stat-icon { +.construct-list .stat-icon { width: 100%; } -.cryp-list .stats .damage-label { +.construct-list .stats .damage-label { grid-area: dl; display: flex; justify-content: center; color: #666; } -.cryp-list .stats .speed-label { +.construct-list .stats .speed-label { grid-area: sl; display: flex; justify-content: center; color: #666; } -.cryp-list .stats .life-label { +.construct-list .stats .life-label { grid-area: ll; display: flex; justify-content: center; diff --git a/client/assets/styles/instance.mobile.css b/client/assets/styles/instance.mobile.css index e8a7ff34..333a7fbe 100644 --- a/client/assets/styles/instance.mobile.css +++ b/client/assets/styles/instance.mobile.css @@ -7,12 +7,12 @@ "top" "controls" "vbox" - "cryps" + "constructs" } /* Default view */ .instance .equip { display: none; } .instance .info { display: none; } - .instance .cryp-list { display: none; } + .instance .construct-list { display: none; } .vbox { grid-area: vbox; display: grid; @@ -31,13 +31,13 @@ .vbox-combiner { margin-left: 0; } - /* Toggled view (cryps)*/ + /* Toggled view (constructs)*/ #toggle-vbox-label { text-align: center; border: 2px solid #555; } #toggle-vbox-label:after{ - content: "Cryps"; + content: "Constructs"; } #toggle-vbox:checked ~ #toggle-vbox-label:after{ @@ -54,8 +54,8 @@ display: initial; } - #toggle-vbox:checked ~ .cryp-list { - grid-area: cryps; + #toggle-vbox:checked ~ .construct-list { + grid-area: constructs; display: grid; justify-content: center; @@ -75,12 +75,12 @@ margin-right: 0.5em; } - .cryp-list .skills { + .construct-list .skills { flex-flow: row; align-items: stretch; } - .instance-cryp { + .instance-construct { grid-row: 2; display: grid; grid-template-rows: min-content 1fr; @@ -95,20 +95,20 @@ transition-timing-function: ease; } - .instance-cryp .skills { + .instance-construct .skills { display: none; } - .instance-cryp .specs { + .instance-construct .specs { display: none; } - .instance-cryp .stats { + .instance-construct .stats { display: none; } - .instance-cryp-active { + .instance-construct-active { grid-row: 1; grid-column: 1 / 3; display: grid; @@ -129,11 +129,11 @@ transition-timing-function: ease; } - .instance-cryp-active img { + .instance-construct-active img { width: 55px; } - /* Cryp Stuff */ + /* Construct Stuff */ } \ No newline at end of file diff --git a/client/assets/styles/styles.css b/client/assets/styles/styles.css index 27c33658..d6736a5e 100644 --- a/client/assets/styles/styles.css +++ b/client/assets/styles/styles.css @@ -2,7 +2,7 @@ GLOBAL */ -html, body, #cryps { +html, body, #constructs { /*width: 100%;*/ margin: 0; @@ -61,7 +61,7 @@ figure { text-align: center; } -#cryps { +#constructs { padding: 0 2em; display: grid; grid-template-columns: 1fr 8fr; @@ -277,13 +277,13 @@ button[disabled] { flex-flow: column; } -#cryps input, #cryps select { +#constructs input, #constructs select { border-color: #444; background-color: #333; border-radius: 0; } -#cryps input:focus { +#constructs input:focus { border-color: whitesmoke; } @@ -349,7 +349,7 @@ header { MENU */ -.menu-cryps { +.menu-constructs { display: grid; grid-template-rows: min-content min-content; @@ -358,14 +358,14 @@ header { "list"; } -.menu-cryps .list { +.menu-constructs .list { grid-area: list; display: grid; grid-template-columns: repeat(3, 1fr); } -.menu-cryp-ctr { +.menu-construct-ctr { /*flex: 0 0 30%;*/ display: flex; @@ -374,7 +374,7 @@ header { justify-content: center; } -.spawn-btn .menu-cryp { +.spawn-btn .menu-construct { border: 1px solid #333; color: #333; display: flex; @@ -399,7 +399,7 @@ header { opacity: 0 } -.menu-cryp { +.menu-construct { height: 100%; margin: 0.5em; box-sizing: border-box; @@ -512,7 +512,7 @@ main .top { } @media (max-height: 900px), (max-width: 1500px) { - #cryps { + #constructs { font-size: 75%; } diff --git a/client/assets/styles/styles.mobile.css b/client/assets/styles/styles.mobile.css index ededd5af..17323160 100644 --- a/client/assets/styles/styles.mobile.css +++ b/client/assets/styles/styles.mobile.css @@ -1,5 +1,5 @@ @media (max-height: 800px), (max-width: 1000px) { - #cryps { + #constructs { font-size: 8pt; padding: 0; grid-template-columns: min-content 1fr; diff --git a/client/index.html b/client/index.html index 58b3d1d7..259100d0 100644 --- a/client/index.html +++ b/client/index.html @@ -1,12 +1,12 @@ - cryps.gg - mnml pvp atbs + mnml pvp tbs - + diff --git a/client/manifest.webmanifest b/client/manifest.webmanifest index 669d4991..de265af3 100644 --- a/client/manifest.webmanifest +++ b/client/manifest.webmanifest @@ -1,7 +1,7 @@ { - "name": "cryps.gg - mnml pvp atbs", - "description": "cryps.gg - mnml pvp atbs", - "short_name": "cryps.gg", + "name": "constructs.gg - mnml pvp atbs", + "description": "constructs.gg - mnml pvp atbs", + "short_name": "constructs.gg", "icons": [ { "src": "./assets/icons/726.png", diff --git a/client/package.json b/client/package.json index a006be4f..dd03ae0c 100644 --- a/client/package.json +++ b/client/package.json @@ -1,5 +1,5 @@ { - "name": "cryps-client", + "name": "mnml-client", "version": "1.0.0", "description": "", "main": "index.js", diff --git a/client/src/actions.jsx b/client/src/actions.jsx index 9fc79bff..9e8e1b43 100644 --- a/client/src/actions.jsx +++ b/client/src/actions.jsx @@ -1,5 +1,5 @@ export const setAccount = value => ({ type: 'SET_ACCOUNT', value }); -export const setCryps = value => ({ type: 'SET_CRYPS', value }); +export const setConstructs = value => ({ type: 'SET_CONSTRUCTS', value }); export const setItemInfo = value => ({ type: 'SET_ITEM_INFO', value }); export const setSkip = value => ({ type: 'SET_SKIP', value }); export const setVboxHighlight = value => ({ type: 'SET_VBOX_HIGHLIGHT', value }); @@ -11,9 +11,9 @@ export const setGame = value => ({ type: 'SET_GAME', value }); export const setResolution = value => ({ type: 'SET_RESOLUTION', value }); export const setShowLog = value => ({ type: 'SET_SHOW_LOG', value }); export const setCombiner = value => ({ type: 'SET_COMBINER', value: Array.from(value) }); -export const setTeam = value => ({ type: 'SET_SELECTED_CRYPS', value: Array.from(value) }); -export const setActiveSkill = (crypId, skill) => ({ type: 'SET_ACTIVE_SKILL', value: crypId ? { crypId, skill } : null }); -export const setActiveCryp = value => ({ type: 'SET_ACTIVE_CRYP', value }); +export const setTeam = value => ({ type: 'SET_SELECTED_CONSTRUCTS', value: Array.from(value) }); +export const setActiveSkill = (constructId, skill) => ({ type: 'SET_ACTIVE_SKILL', value: constructId ? { constructId, skill } : null }); +export const setActiveConstruct = value => ({ type: 'SET_ACTIVE_CONSTRUCT', value }); export const setActiveItem = value => ({ type: 'SET_ACTIVE_VAR', value }); export const setInfo = value => ({ type: 'SET_INFO', value }); export const setItemEquip = value => ({ type: 'SET_ITEM_EQUIP', value }); diff --git a/client/src/app.jsx b/client/src/app.jsx index a55e8647..60a58a4c 100644 --- a/client/src/app.jsx +++ b/client/src/app.jsx @@ -28,8 +28,8 @@ document.fonts.load('16pt "Jura"').then(() => { store.dispatch(actions.setWs(ws)); ws.connect(); - const Cryps = () => ( -
+ const Constructs = () => ( +
@@ -40,7 +40,7 @@ document.fonts.load('16pt "Jura"').then(() => { const App = () => ( - + ); diff --git a/client/src/components/cryp.spawn.button.jsx b/client/src/components/cryp.spawn.button.jsx index a4f0e5bb..66e6d225 100644 --- a/client/src/components/cryp.spawn.button.jsx +++ b/client/src/components/cryp.spawn.button.jsx @@ -1,6 +1,6 @@ const preact = require('preact'); -function renderSpawnButton({ account, sendCrypSpawn }) { +function renderSpawnButton({ account, sendConstructSpawn }) { let name = ''; if (!account) return
...
; @@ -13,7 +13,7 @@ function renderSpawnButton({ account, sendCrypSpawn }) { (name = e.target.value)} />
@@ -21,7 +21,7 @@ function renderSpawnButton({ account, sendCrypSpawn }) {
diff --git a/client/src/components/cryp.spawn.container.js b/client/src/components/cryp.spawn.container.js index 9b743b1b..3ba5b1cf 100644 --- a/client/src/components/cryp.spawn.container.js +++ b/client/src/components/cryp.spawn.container.js @@ -1,16 +1,16 @@ const { connect } = require('react-redux'); -const CrypSpawnButton = require('./cryp.spawn.button'); +const ConstructSpawnButton = require('./construct.spawn.button'); const addState = connect( function receiveState(state) { const { ws } = state; - function sendCrypSpawn(name) { - return ws.sendCrypSpawn(name); + function sendConstructSpawn(name) { + return ws.sendConstructSpawn(name); } - return { account: state.account, sendCrypSpawn }; + return { account: state.account, sendConstructSpawn }; } ); -module.exports = addState(CrypSpawnButton); +module.exports = addState(ConstructSpawnButton); diff --git a/client/src/components/game.component.jsx b/client/src/components/game.component.jsx index fd83df43..d332d528 100644 --- a/client/src/components/game.component.jsx +++ b/client/src/components/game.component.jsx @@ -1,7 +1,7 @@ const preact = require('preact'); -const { STATS, eventClasses, getCombatText, crypAvatar } = require('../utils'); +const { STATS, eventClasses, getCombatText, constructAvatar } = require('../utils'); const { animationDivs } = require('../animations'); -const GameCryp = require('./game.cryp'); +const GameConstruct = require('./game.construct'); function GamePanel(props) { const { @@ -10,7 +10,7 @@ function GamePanel(props) { resolution, activeSkill, setActiveSkill, - setActiveCryp, + setActiveConstruct, selectSkillTarget, sendInstanceState, sendGameReady, @@ -76,9 +76,9 @@ function GamePanel(props) {
); - function findCryp(id) { - const team = game.players.find(t => t.cryps.find(c => c.id === id)); - if (team) return team.cryps.find(c => c.id === id); + function findConstruct(id) { + const team = game.players.find(t => t.constructs.find(c => c.id === id)); + if (team) return team.constructs.find(c => c.id === id); return null; } @@ -109,39 +109,39 @@ function GamePanel(props) { ); function PlayerTeam(team) { - const cryps = team.cryps.map((c, i) => ); + const constructs = team.constructs.map((c, i) => ); return (
- {cryps} + {constructs}
); } - function OpponentCryp(cryp, i) { - const ko = cryp.green_life.value === 0 ? 'ko' : ''; - const classes = eventClasses(resolution, cryp); + function OpponentConstruct(construct, i) { + const ko = construct.green_life.value === 0 ? 'ko' : ''; + const classes = eventClasses(resolution, construct); const stats = [STATS.greenLife, STATS.redLife, STATS.blueLife].map((s, j) => (
{s.svg(`stat-icon ${s.colour}`)} -
{cryp[s.stat].value} / {cryp[s.stat].max}
+
{construct[s.stat].value} / {construct[s.stat].max}
)); - const [combatText, combatClass] = getCombatText(cryp, resolution); + const [combatText, combatClass] = getCombatText(construct, resolution); const combatTextClass = `combat-text ${combatClass}`; const combatTextEl = combatText ?
{combatText}
: null; - const effects = cryp.effects.length - ? cryp.effects.map(c =>
{c.effect} - {c.duration}T
) + const effects = construct.effects.length + ? construct.effects.map(c =>
{c.effect} - {c.duration}T
) :
 
; - const playerTeamIds = playerTeam.cryps.map(c => c.id); + const playerTeamIds = playerTeam.constructs.map(c => c.id); const targeting = game.stack - .filter(s => playerTeamIds.includes(s.source_cryp_id) && s.target_cryp_id === cryp.id) + .filter(s => playerTeamIds.includes(s.source_construct_id) && s.target_construct_id === construct.id) .map((s, i) =>

{`< ${s.skill}`}

); const anim = ( @@ -153,17 +153,17 @@ function GamePanel(props) { return (
selectSkillTarget(cryp.id)} > + onClick={() => selectSkillTarget(construct.id)} >
{stats}
-

{cryp.name}

+

{construct.name}

{effects}
{targeting}
selectSkillTarget(cryp.id)} > - {crypAvatar(cryp.name, cryp.id)} + onClick={() => selectSkillTarget(construct.id)} > + {constructAvatar(construct.name, construct.id)} {combatTextEl} {anim}
@@ -173,10 +173,10 @@ function GamePanel(props) { function OpponentTeam(team) { - const cryps = team.cryps.map(OpponentCryp); + const constructs = team.constructs.map(OpponentConstruct); return (
- {cryps} + {constructs}
); } @@ -185,7 +185,7 @@ function GamePanel(props) { function gameClick(e) { e.stopPropagation(); - setActiveCryp(null); + setActiveConstruct(null); } return ( diff --git a/client/src/components/game.container.jsx b/client/src/components/game.container.jsx index 03c421dc..50ebb468 100644 --- a/client/src/components/game.container.jsx +++ b/client/src/components/game.container.jsx @@ -13,12 +13,12 @@ const addState = connect( resolution, showLog, activeSkill, - activeCryp, + activeConstruct, } = state; - function selectSkillTarget(targetCrypId) { + function selectSkillTarget(targetConstructId) { if (activeSkill) { - return ws.sendGameSkill(game.id, activeSkill.crypId, targetCrypId, activeSkill.skill); + return ws.sendGameSkill(game.id, activeSkill.constructId, targetConstructId, activeSkill.skill); } return false; } @@ -34,7 +34,7 @@ const addState = connect( // intercept self casting skills if (activeSkill && activeSkill.skill.self_targeting) { - ws.sendGameSkill(game.id, activeSkill.crypId, null, activeSkill.skill.skill); + ws.sendGameSkill(game.id, activeSkill.constructId, null, activeSkill.skill.skill); } return { @@ -43,7 +43,7 @@ const addState = connect( account, resolution, activeSkill, - activeCryp, + activeConstruct, selectSkillTarget, sendInstanceState, sendGameReady, @@ -51,13 +51,13 @@ const addState = connect( }, function receiveDispatch(dispatch) { - function setActiveSkill(crypId, skill) { - dispatch(actions.setActiveSkill(crypId, skill)); - // particlesJS(`particles-${crypId}`, config); + function setActiveSkill(constructId, skill) { + dispatch(actions.setActiveSkill(constructId, skill)); + // particlesJS(`particles-${constructId}`, config); } - function setActiveCryp(cryp) { - dispatch(actions.setActiveCryp(cryp)); + function setActiveConstruct(construct) { + dispatch(actions.setActiveConstruct(construct)); } function quit() { @@ -73,7 +73,7 @@ const addState = connect( dispatch(actions.setSkip(true)); } - return { setActiveSkill, setActiveCryp, quit, toggleLog, skip }; + return { setActiveSkill, setActiveConstruct, quit, toggleLog, skip }; } ); diff --git a/client/src/components/game.cryp.jsx b/client/src/components/game.cryp.jsx index 89bb2305..f26f8ff3 100644 --- a/client/src/components/game.cryp.jsx +++ b/client/src/components/game.cryp.jsx @@ -3,7 +3,7 @@ const preact = require('preact'); const range = require('lodash/range'); const actions = require('../actions'); -const { STATS, eventClasses, getCombatText, crypAvatar } = require('../utils'); +const { STATS, eventClasses, getCombatText, constructAvatar } = require('../utils'); const { animationDivs } = require('../animations'); const SkillBtn = require('./skill.btn'); @@ -18,16 +18,16 @@ const addState = connect( activeSkill, } = state; - function selectSkillTarget(targetCrypId) { + function selectSkillTarget(targetConstructId) { if (activeSkill) { - return ws.sendGameSkill(game.id, activeSkill.crypId, targetCrypId, activeSkill.skill); + return ws.sendGameSkill(game.id, activeSkill.constructId, targetConstructId, activeSkill.skill); } return false; } // intercept self casting skills if (activeSkill && activeSkill.skill.self_targeting) { - ws.sendGameSkill(game.id, activeSkill.crypId, null, activeSkill.skill.skill); + ws.sendGameSkill(game.id, activeSkill.constructId, null, activeSkill.skill.skill); } return { @@ -40,48 +40,48 @@ const addState = connect( }, ); -function GameCryp(props) { +function GameConstruct(props) { const { game, account, - cryp, + construct, resolution, activeSkill, - setActiveCryp, + setActiveConstruct, selectSkillTarget, } = props; - const ko = cryp.green_life.value === 0 ? 'ko' : ''; - const classes = eventClasses(resolution, cryp); + const ko = construct.green_life.value === 0 ? 'ko' : ''; + const classes = eventClasses(resolution, construct); const skills = range(0, 3) - .map(i => ); + .map(i => ); const stats = [STATS.greenLife, STATS.redLife, STATS.blueLife].map((s, j) => { // i've seen this happen ;/ - if (cryp[s.stat].value < 0) console.warn(cryp); + if (construct[s.stat].value < 0) console.warn(construct); return
{s.svg(`stat-icon ${s.colour}`)} -
{cryp[s.stat].value} / {cryp[s.stat].max}
+
{construct[s.stat].value} / {construct[s.stat].max}
}); - const [combatText, combatClass] = getCombatText(cryp, resolution); + const [combatText, combatClass] = getCombatText(construct, resolution); const combatTextClass = `combat-text ${combatClass}`; const combatTextEl = combatText ?
{combatText}
: null; - const effects = cryp.effects.length - ? cryp.effects.map(c =>
{c.effect} - {c.duration}T
) + const effects = construct.effects.length + ? construct.effects.map(c =>
{c.effect} - {c.duration}T
) :
 
; const playerTeam = game.players.find(t => t.id === account.id); - const playerTeamIds = playerTeam.cryps.map(c => c.id); + const playerTeamIds = playerTeam.constructs.map(c => c.id); const targeting = game.stack - .filter(s => playerTeamIds.includes(s.source_cryp_id) && s.target_cryp_id === cryp.id) + .filter(s => playerTeamIds.includes(s.source_construct_id) && s.target_construct_id === construct.id) .map((s, i) =>

{`< ${s.skill}`}

); const anim = ( @@ -93,9 +93,9 @@ function GameCryp(props) { return (
+ className={`game-construct ${ko} ${classes}`} >

- {cryp.name} + {construct.name}

{skills} @@ -105,8 +105,8 @@ function GameCryp(props) {
selectSkillTarget(cryp.id)} > - {crypAvatar(cryp.name, cryp.id)} + onClick={() => selectSkillTarget(construct.id)} > + {constructAvatar(construct.name, construct.id)} {combatTextEl} {anim}
@@ -120,4 +120,4 @@ function GameCryp(props) { ); } -module.exports = addState(GameCryp); +module.exports = addState(GameConstruct); diff --git a/client/src/components/header.component.jsx b/client/src/components/header.component.jsx index 1a5077bd..1df1afc4 100644 --- a/client/src/components/header.component.jsx +++ b/client/src/components/header.component.jsx @@ -23,7 +23,7 @@ function renderHeader(args) { return (

- cryps.gg + mnml.gg

{accountStatus}
diff --git a/client/src/components/info.component.jsx b/client/src/components/info.component.jsx index 2c7f2dc8..8af1fbef 100644 --- a/client/src/components/info.component.jsx +++ b/client/src/components/info.component.jsx @@ -27,10 +27,10 @@ function Info(args) { let red = 0; let blue = 0; let green = 0; - player.cryps.forEach(cryp => { - red += cryp.colours.red; - blue += cryp.colours.blue; - green += cryp.colours.green; + player.constructs.forEach(construct => { + red += construct.colours.red; + blue += construct.colours.blue; + green += construct.colours.green; }); const teamColours = { red, blue, green }; diff --git a/client/src/components/instance.component.jsx b/client/src/components/instance.component.jsx index e8fb641b..dff4d03c 100644 --- a/client/src/components/instance.component.jsx +++ b/client/src/components/instance.component.jsx @@ -3,7 +3,7 @@ const { connect } = require('react-redux'); const Vbox = require('./vbox.component'); const InfoContainer = require('./info.container'); -const InstanceCrypsContainer = require('./instance.cryps'); +const InstanceConstructsContainer = require('./instance.constructs'); const EquipmentContainer = require('./instance.equip'); const actions = require('../actions'); @@ -137,7 +137,7 @@ function Instance(args) { - + ); } diff --git a/client/src/components/instance.create.form.jsx b/client/src/components/instance.create.form.jsx index 6eefda23..77a8abfc 100644 --- a/client/src/components/instance.create.form.jsx +++ b/client/src/components/instance.create.form.jsx @@ -6,9 +6,9 @@ const addState = connect( function receiveState(state) { const { ws, team } = state; - function sendInstanceNew(sCryps, name, players) { - if (sCryps.length) { - return ws.sendInstanceNew(sCryps, name, players); + function sendInstanceNew(sConstructs, name, players) { + if (sConstructs.length) { + return ws.sendInstanceNew(sConstructs, name, players); } return false; } diff --git a/client/src/components/instance.cryps.jsx b/client/src/components/instance.cryps.jsx index 4906520c..6e86b3ee 100644 --- a/client/src/components/instance.cryps.jsx +++ b/client/src/components/instance.cryps.jsx @@ -3,24 +3,24 @@ const preact = require('preact'); const range = require('lodash/range'); const shapes = require('./shapes'); -const { SPECS, STATS, instanceCryp } = require('../utils'); +const { SPECS, STATS, instanceConstruct } = require('../utils'); const actions = require('../actions'); const addState = connect( function receiveState(state) { - const { ws, instance, account, itemInfo, itemEquip, activeCryp } = state; + const { ws, instance, account, itemInfo, itemEquip, activeConstruct } = state; const player = instance.players.find(p => p.id === account.id); function sendInstanceReady() { return ws.sendInstanceReady(instance.id); } - function sendVboxApply(crypId, i) { - return ws.sendVboxApply(instance.id, crypId, i); + function sendVboxApply(constructId, i) { + return ws.sendVboxApply(instance.id, constructId, i); } - function sendUnequip(crypId, item) { - return ws.sendVboxUnequip(instance.id, crypId, item); + function sendUnequip(constructId, item) { + return ws.sendVboxUnequip(instance.id, constructId, item); } return { @@ -31,7 +31,7 @@ const addState = connect( sendVboxApply, itemInfo, itemEquip, - activeCryp, + activeConstruct, sendUnequip, }; }, @@ -45,8 +45,8 @@ const addState = connect( dispatch(actions.setInfo(item)); } - function setActiveCryp(value) { - dispatch(actions.setActiveCryp(value)); + function setActiveConstruct(value) { + dispatch(actions.setActiveConstruct(value)); } function clearInfo() { @@ -61,19 +61,19 @@ const addState = connect( return dispatch(actions.setItemUnequip(v)); } - return { quit, clearInfo, setInfo, setActiveCryp, setItemUnequip, setItemEquip }; + return { quit, clearInfo, setInfo, setActiveConstruct, setItemUnequip, setItemEquip }; } ); -function Cryp(props) { +function Construct(props) { const { - activeCryp, + activeConstruct, itemEquip, - cryp, + construct, player, sendVboxApply, - setActiveCryp, + setActiveConstruct, setItemUnequip, setItemEquip, itemInfo, @@ -84,9 +84,9 @@ function Cryp(props) { function onClick(e) { e.stopPropagation(); e.preventDefault(); - if (itemEquip !== null) sendVboxApply(cryp.id, itemEquip); + if (itemEquip !== null) sendVboxApply(construct.id, itemEquip); setItemEquip(null); - return setActiveCryp(cryp); + return setActiveConstruct(construct); } function hoverInfo(e, info) { @@ -100,7 +100,7 @@ function Cryp(props) { const specList = itemInfo.items.filter(v => v.spec).map(v => v.item); const skills = range(0, 3).map(i => { - const skill = cryp.skills[i]; + const skill = construct.skills[i]; const s = skill ? skill.skill : (+); @@ -108,15 +108,15 @@ function Cryp(props) { function skillClick(e) { if (!skill) return false; setItemUnequip(skill.skill); - setActiveCryp(cryp); + setActiveConstruct(construct); e.stopPropagation(); return true; } function skillDblClick(e) { if (!skill) return false; - sendUnequip(cryp.id, skill.skill); - setActiveCryp(null); + sendUnequip(construct.id, skill.skill); + setActiveConstruct(null); setItemUnequip(null); e.stopPropagation(); e.preventDefault(); @@ -140,7 +140,7 @@ function Cryp(props) { }); const specs = range(0, 6).map(i => { - const s = cryp.specs[i]; + const s = construct.specs[i]; if (!s) { const equip = specList.includes(vbox.bound[itemEquip]) ? 'equip-spec' : 'gray'; @@ -155,12 +155,12 @@ function Cryp(props) { function specClick(e) { e.stopPropagation(); setItemUnequip(s); - setActiveCryp(cryp); + setActiveConstruct(construct); } function specDblClick(e) { - sendUnequip(cryp.id, s); - setActiveCryp(null); + sendUnequip(construct.id, s); + setActiveConstruct(null); setItemUnequip(null); e.stopPropagation(); e.preventDefault(); @@ -183,14 +183,14 @@ function Cryp(props) { const stats = Object.values(STATS).map(s => (
{s.svg(`stat-icon ${s.colour} stat`)} -
{cryp[s.stat].value}
+
{construct[s.stat].value}
)); - const activeId = activeCryp ? activeCryp.id : false; - const crypClass = activeId === cryp.id ? 'instance-cryp-active' : 'instance-cryp'; + const activeId = activeConstruct ? activeConstruct.id : false; + const constructClass = activeId === construct.id ? 'instance-construct-active' : 'instance-construct'; - // const cTotal = cryp.colours.red + cryp.colours.blue + cryp.colours.green; - // const colours = mapValues(cryp.colours, c => { + // const cTotal = construct.colours.red + construct.colours.blue + construct.colours.green; + // const colours = mapValues(construct.colours, c => { // if (cTotal === 0) return 245; // return Math.floor(c / cTotal * 255); // }); @@ -204,13 +204,13 @@ function Cryp(props) { // const border = { border: `${thickness(cTotal)}px solid rgba(${colours.red}, ${colours.green}, ${colours.blue}, ${alpha})` }; return ( -
- {instanceCryp(cryp.name, cryp.id)} -

{cryp.name}

-
hoverInfo(e, 'crypSkills')} > +
+ {instanceConstruct(construct.name, construct.id)} +

{construct.name}

+
hoverInfo(e, 'constructSkills')} > {skills}
-
hoverInfo(e, 'crypSpecs')} > +
hoverInfo(e, 'constructSpecs')} > {specs}
@@ -231,15 +231,15 @@ function Cryp(props) { ); } -function InstanceCryps(props) { +function InstanceConstructs(props) { const { - activeCryp, + activeConstruct, itemEquip, player, instance, // clearInfo, setInfo, - setActiveCryp, + setActiveConstruct, sendVboxApply, itemInfo, @@ -252,27 +252,27 @@ function InstanceCryps(props) { if (!player) return false; if (instance.phase === 'Lobby') return false; - const cryps = player.cryps.map((c, i) => Cryp({ - cryp: c, - activeCryp, + const constructs = player.constructs.map((c, i) => Construct({ + construct: c, + activeConstruct, itemEquip, setItemUnequip, setItemEquip, player, sendVboxApply, setInfo, - setActiveCryp, + setActiveConstruct, itemInfo, setVboxHighlight, sendUnequip, })); - const classes = `cryp-list`; + const classes = `construct-list`; return ( -
setActiveCryp(null)}> - {cryps} +
setActiveConstruct(null)}> + {constructs}
); } -module.exports = addState(InstanceCryps); +module.exports = addState(InstanceConstructs); diff --git a/client/src/components/instance.equip.jsx b/client/src/components/instance.equip.jsx index 174d8fb4..fa5f8813 100644 --- a/client/src/components/instance.equip.jsx +++ b/client/src/components/instance.equip.jsx @@ -8,14 +8,14 @@ const { convertItem, SPECS } = require('./../utils'); const addState = connect( function receiveState(state) { - const { account, activeCryp, itemInfo, info, ws, instance, itemUnequip } = state; + const { account, activeConstruct, itemInfo, info, ws, instance, itemUnequip } = state; const player = instance.players.find(p => p.id === account.id); - function sendUnequip(crypId, item) { - return ws.sendVboxUnequip(instance.id, crypId, item); + function sendUnequip(constructId, item) { + return ws.sendVboxUnequip(instance.id, constructId, item); } - return { player, itemInfo, instance, info, sendUnequip, activeCryp, itemUnequip }; + return { player, itemInfo, instance, info, sendUnequip, activeConstruct, itemUnequip }; }, function receiveDispatch(dispatch) { @@ -48,7 +48,7 @@ function Equipment(props) { itemUnequip, setItemEquip, setItemUnequip, - activeCryp, + activeConstruct, itemInfo, sendUnequip, @@ -65,7 +65,7 @@ function Equipment(props) { const isSpec = fullInfo && fullInfo.spec; function skillClick(e, i) { - if (itemUnequip && activeCryp) return false; + if (itemUnequip && activeConstruct) return false; const value = vbox.bound[i]; setItemEquip(i); return false; @@ -74,9 +74,9 @@ function Equipment(props) { function unequipClick(e) { e.stopPropagation(); if (!itemUnequip) return false; - if (!activeCryp) return false; + if (!activeConstruct) return false; setItemUnequip(null); - return sendUnequip(activeCryp.id, itemUnequip); + return sendUnequip(activeConstruct.id, itemUnequip); } function hoverInfo(e, info) { diff --git a/client/src/components/list.jsx b/client/src/components/list.jsx index de57c909..18674f30 100644 --- a/client/src/components/list.jsx +++ b/client/src/components/list.jsx @@ -7,7 +7,7 @@ const InstanceCreateForm = require('./instance.create.form'); const addState = connect( function receiveState(state) { - const { ws, cryps, team, instances, account } = state; + const { ws, constructs, team, instances, account } = state; function sendInstanceJoin(instance) { if (team.length) { @@ -26,7 +26,7 @@ const addState = connect( return { account, - cryps, + constructs, team, sendInstanceJoin, sendInstanceState, diff --git a/client/src/components/menu.component.jsx b/client/src/components/menu.component.jsx index 0356ffd3..479e0eff 100644 --- a/client/src/components/menu.component.jsx +++ b/client/src/components/menu.component.jsx @@ -3,7 +3,7 @@ const range = require('lodash/range'); const { NULL_UUID } = require('./../utils'); -const { stringSort, crypAvatar } = require('./../utils'); +const { stringSort, constructAvatar } = require('./../utils'); const SpawnButton = require('./spawn.button'); const InstanceCreateForm = require('./instance.create.form'); @@ -19,14 +19,14 @@ const COLOURS = [ function Menu(args) { const { account, - cryps, + constructs, team, setTeam, sendInstanceState, - sendPlayerMmCrypsSet, + sendPlayerMmConstructsSet, sendInstanceJoin, sendInstanceList, - sendCrypSpawn, + sendConstructSpawn, instances, } = args; @@ -61,7 +61,7 @@ function Menu(args) { // // ); @@ -88,12 +88,12 @@ function Menu(args) { ); } - function crypList() { - if (!cryps) return
; + function constructList() { + if (!constructs) return
; // redux limitation + suggested workaround // so much for dumb components - function selectCryp(id) { + function selectConstruct(id) { // remove const i = team.findIndex(sid => sid === id); if (i > -1) { @@ -108,37 +108,37 @@ function Menu(args) { return setTeam(team); } - const crypPanels = cryps.sort(idSort).map(cryp => { - const colour = team.indexOf(cryp.id); + const constructPanels = constructs.sort(idSort).map(construct => { + const colour = team.indexOf(construct.id); const selected = colour > -1; const borderColour = selected ? COLOURS[colour] : '#000000'; return (
+ key={construct.id} + className="menu-construct-ctr">
selectCryp(cryp.id)} > - {crypAvatar(cryp.name)} -

{cryp.name}

+ onClick={() => selectConstruct(construct.id)} > + {constructAvatar(construct.name)} +

{construct.name}

); }); - const spawnButtonsNum = cryps.length < 3 - ? (3 - cryps.length) + const spawnButtonsNum = constructs.length < 3 + ? (3 - constructs.length) : 1; const spawnButtons = range(spawnButtonsNum) - .map(i => sendCrypSpawn(name)} />); + .map(i => sendConstructSpawn(name)} />); return ( -
- {crypPanels} +
+ {constructPanels} {spawnButtons}
); diff --git a/client/src/components/menu.container.jsx b/client/src/components/menu.container.jsx index bd2fecc1..a43dab97 100644 --- a/client/src/components/menu.container.jsx +++ b/client/src/components/menu.container.jsx @@ -5,7 +5,7 @@ const actions = require('./../actions'); const addState = connect( function receiveState(state) { - const { ws, cryps, team, instances, account } = state; + const { ws, constructs, team, instances, account } = state; function sendInstanceJoin(instance) { if (team.length) { @@ -14,15 +14,15 @@ const addState = connect( return false; } - function sendPlayerMmCrypsSet() { + function sendPlayerMmConstructsSet() { if (team.length) { - return ws.sendPlayerMmCrypsSet(team); + return ws.sendPlayerMmConstructsSet(team); } return false; } - function sendCrypSpawn(name) { - return ws.sendCrypSpawn(name); + function sendConstructSpawn(name) { + return ws.sendConstructSpawn(name); } function sendInstanceState(instance) { @@ -35,20 +35,20 @@ const addState = connect( return { account, - cryps, + constructs, team, sendInstanceJoin, sendInstanceState, sendInstanceList, - sendCrypSpawn, - sendPlayerMmCrypsSet, + sendConstructSpawn, + sendPlayerMmConstructsSet, instances, }; }, function receiveDispatch(dispatch) { - function setTeam(crypIds) { - dispatch(actions.setTeam(crypIds)); + function setTeam(constructIds) { + dispatch(actions.setTeam(constructIds)); } return { diff --git a/client/src/components/nav.jsx b/client/src/components/nav.jsx index c06bc2d6..30a99040 100644 --- a/client/src/components/nav.jsx +++ b/client/src/components/nav.jsx @@ -15,7 +15,7 @@ const addState = connect( account, instances, team, - cryps, + constructs, game, } = state; @@ -27,7 +27,7 @@ const addState = connect( account, instances, team, - cryps, + constructs, game, sendInstanceState, }; @@ -60,7 +60,7 @@ function Nav(args) { account, sendInstanceState, team, - cryps, + constructs, instances, game, @@ -81,8 +81,8 @@ function Nav(args) { const teamElements = team.map((c, i) => { if (c) { - const cryp = cryps.find(f => f.id === c); - return ; + const construct = constructs.find(f => f.id === c); + return ; } return ; }); diff --git a/client/src/components/skill.btn.jsx b/client/src/components/skill.btn.jsx index 548a8cc1..0a1742a1 100644 --- a/client/src/components/skill.btn.jsx +++ b/client/src/components/skill.btn.jsx @@ -17,8 +17,8 @@ const addState = connect( }, function receiveDispatch(dispatch) { - function setActiveSkill(crypId, skill) { - dispatch(actions.setActiveSkill(crypId, skill)); + function setActiveSkill(constructId, skill) { + dispatch(actions.setActiveSkill(constructId, skill)); } return { setActiveSkill }; @@ -28,7 +28,7 @@ const addState = connect( function Skill(props) { const { - cryp, + construct, game, i, mobile, @@ -36,14 +36,14 @@ function Skill(props) { setActiveSkill, } = props; - const s = cryp.skills[i]; - const ko = cryp.green_life.value === 0 ? 'ko' : ''; + const s = construct.skills[i]; + const ko = construct.green_life.value === 0 ? 'ko' : ''; if (!s) { return ( ); } @@ -52,25 +52,25 @@ function Skill(props) { ? 'top' : ''; - const cdText = cryp.skills[i].cd > 0 + const cdText = construct.skills[i].cd > 0 ? `- ${s.cd}T` : ''; const highlight = activeSkill - ? activeSkill.crypId === cryp.id && activeSkill.skill === s.skill + ? activeSkill.constructId === construct.id && activeSkill.skill === s.skill : false; function onClick(e) { e.stopPropagation(); - return setActiveSkill(cryp.id, s.skill); + return setActiveSkill(construct.id, s.skill); } - const targeting = game.stack.some(stack => stack.source_cryp_id === cryp.id && stack.skill === s.skill); + const targeting = game.stack.some(stack => stack.source_construct_id === construct.id && stack.skill === s.skill); return ( '; @@ -173,7 +173,7 @@ function registerEvents(registry, events, tutorial) { function submitSpawn(instance, thisToast, button, e, inputs) { const NAME = inputs[0].value; - ws.sendCrypSpawn(NAME); + ws.sendConstructSpawn(NAME); instance.hide({ transitionOut: 'fadeOut' }, thisToast, 'button'); } @@ -184,7 +184,7 @@ function registerEvents(registry, events, tutorial) { // overlay: true, drag: false, close: true, - title: 'SPAWN CRYP', + title: 'SPAWN CONSTRUCT', position: 'center', inputs: [ [NAME_INPUT, 'change', null, true], // true to focus @@ -202,8 +202,8 @@ function registerEvents(registry, events, tutorial) { loginPrompt, setAccount, setActiveSkill, - setCryps, - setCrypList, + setConstructs, + setConstructList, setGame, setMenu, setPlayer, diff --git a/phaser-client/src/main.js b/phaser-client/src/main.js index 7a0adc64..ef2fbede 100644 --- a/phaser-client/src/main.js +++ b/phaser-client/src/main.js @@ -1,11 +1,11 @@ -const renderCryps = require('./scenes/cryps'); +const renderConstructs = require('./scenes/constructs'); const createSocket = require('./socket'); const registerEvents = require('./events'); const createTutorial = require('./tutorial'); document.fonts.load('10pt "Jura"').then(() => { - const game = renderCryps(); + const game = renderConstructs(); const tutorial = createTutorial(); const events = registerEvents(game.registry, game.events, tutorial); const ws = createSocket(events); diff --git a/phaser-client/src/scenes/combat.animations.js b/phaser-client/src/scenes/combat.animations.js index 58fae31d..7a1ef934 100644 --- a/phaser-client/src/scenes/combat.animations.js +++ b/phaser-client/src/scenes/combat.animations.js @@ -40,7 +40,7 @@ class CombatSkills extends Phaser.GameObjects.Group { } genericHeal(sourceAlly, castLocation) { - // const { sourceX, sourceY } = getCrypPosition(sourcePos, 0); + // const { sourceX, sourceY } = getConstructPosition(sourcePos, 0); const lifespan = DELAYS.ANIMATION_DURATION; const colour = randomColour(); const particles = this.scene.add.particles(colour); diff --git a/phaser-client/src/scenes/combat.cryps.js b/phaser-client/src/scenes/combat.cryps.js index 9112d2ad..6616a5b4 100644 --- a/phaser-client/src/scenes/combat.cryps.js +++ b/phaser-client/src/scenes/combat.cryps.js @@ -4,27 +4,27 @@ const StatBar = require('./elements/combat.statbar'); const { DELAYS, TEXT, POSITIONS: { COMBAT } } = require('./constants'); -const CRYP_MARGIN = COMBAT.crypMargin(); +const CONSTRUCT_MARGIN = COMBAT.constructMargin(); const TEXT_MARGIN = COMBAT.textMargin(); -const crypAvatarText = (team, iter) => { +const constructAvatarText = (team, iter) => { const nameX = COMBAT.width() * team; - const nameY = COMBAT.y() + CRYP_MARGIN * iter + COMBAT.height() * 0.07; + const nameY = COMBAT.y() + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; const statusX = COMBAT.width() * team; - const statusY = COMBAT.y() + TEXT_MARGIN * 6 + CRYP_MARGIN * iter + COMBAT.height() * 0.07; + const statusY = COMBAT.y() + TEXT_MARGIN * 6 + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; return { statusX, statusY, nameX, nameY }; }; -const crypEffects = (team, iter) => { - const crypEffectsX = team ? COMBAT.width() - COMBAT.width() / 6.5 : COMBAT.width() / 6.5; - const crypEffectsY = TEXT_MARGIN * 2 + CRYP_MARGIN * iter; - return { crypEffectsX, crypEffectsY }; +const constructEffects = (team, iter) => { + const constructEffectsX = team ? COMBAT.width() - COMBAT.width() / 6.5 : COMBAT.width() / 6.5; + const constructEffectsY = TEXT_MARGIN * 2 + CONSTRUCT_MARGIN * iter; + return { constructEffectsX, constructEffectsY }; }; -const crypPosition = (team, iter) => { - const crypAvatarX = team ? COMBAT.width() - COMBAT.width() / 6 : COMBAT.width() / 6; - const crypAvatarY = TEXT_MARGIN * 5 + CRYP_MARGIN * iter; - return { crypAvatarX, crypAvatarY }; +const constructPosition = (team, iter) => { + const constructAvatarX = team ? COMBAT.width() - COMBAT.width() / 6 : COMBAT.width() / 6; + const constructAvatarY = TEXT_MARGIN * 5 + CONSTRUCT_MARGIN * iter; + return { constructAvatarX, constructAvatarY }; }; @@ -32,8 +32,8 @@ class Effects extends Phaser.GameObjects.Group { constructor(scene, team, iter) { super(scene); this.scene = scene; - const { crypEffectsX, crypEffectsY } = crypEffects(team, iter); - this.x = crypEffectsX; this.y = crypEffectsY; + const { constructEffectsX, constructEffectsY } = constructEffects(team, iter); + this.x = constructEffectsX; this.y = constructEffectsY; this.effectCount = 0; } @@ -62,28 +62,28 @@ class Effects extends Phaser.GameObjects.Group { } } -class CrypImage extends Phaser.GameObjects.Image { - constructor(scene, team, iter, cryp) { +class ConstructImage extends Phaser.GameObjects.Image { + constructor(scene, team, iter, construct) { // Get coords - const { crypAvatarX, crypAvatarY } = crypPosition(team, iter); - const { statusX, statusY, nameX, nameY } = crypAvatarText(team, iter); + const { constructAvatarX, constructAvatarY } = constructPosition(team, iter); + const { statusX, statusY, nameX, nameY } = constructAvatarText(team, iter); - // Cryp display + // Construct display // const avatar = team ? 'magmar' : 'alk'; - super(scene, crypAvatarX, crypAvatarY, 'aztec', genAvatar(cryp.name)); + super(scene, constructAvatarX, constructAvatarY, 'aztec', genAvatar(construct.name)); this.setScale(0.5); if (!team) this.flipX = true; - // Save position and cryp details + // Save position and construct details this.scene = scene; this.iter = iter; this.team = team; - this.cryp = cryp; + this.construct = construct; this.state = 'deselect'; - // Add cryp name - scene.add.text(nameX, nameY, cryp.name, TEXT.NORMAL).setOrigin(team, 0); - // Add cryp stat bars + // Add construct name + scene.add.text(nameX, nameY, construct.name, TEXT.NORMAL).setOrigin(team, 0); + // Add construct stat bars this.health = scene.add.existing(new StatBar(scene, this, 'HP')); this.red_shield = scene.add.existing(new StatBar(scene, this, 'Red Shield')); this.blue_shield = scene.add.existing(new StatBar(scene, this, 'Blue Shield')); @@ -141,18 +141,18 @@ class CrypImage extends Phaser.GameObjects.Image { } } -class CombatCryps extends Phaser.Scene { +class CombatConstructs extends Phaser.Scene { constructor() { - super({ key: 'CombatCryps' }); + super({ key: 'CombatConstructs' }); } create(game) { - this.cryps = this.add.group(); + this.constructs = this.add.group(); this.phase = game.phase; this.account = this.registry.get('account'); - this.drawCryps(game); + this.drawConstructs(game); this.registry.events.on('changedata', this.updateData, this); - this.registry.set('crypStatusUpdate', false); + this.registry.set('constructStatusUpdate', false); this.teams = game.teams.length; } @@ -168,65 +168,65 @@ class CombatCryps extends Phaser.Scene { const shouldUpdate = data !== this.phase; this.phase = data; if (shouldUpdate) { - this.cryps.children.entries.forEach(c => c.clearStatus()); - this.drawCryps(this.game); + this.constructs.children.entries.forEach(c => c.clearStatus()); + this.drawConstructs(this.game); } } - if (key === 'crypStatusUpdate' && data) { - this.updateCrypStatus(data); + if (key === 'constructStatusUpdate' && data) { + this.updateConstructStatus(data); } return true; } - drawCryps(game) { - const renderCryp = (cryp, iter, team) => { + drawConstructs(game) { + const renderConstruct = (construct, iter, team) => { // Add Image Avatar Class - const crypObj = new CrypImage(this, team, iter, cryp); - this.add.existing(crypObj); - this.cryps.add(crypObj); - return crypObj; + const constructObj = new ConstructImage(this, team, iter, construct); + this.add.existing(constructObj); + this.constructs.add(constructObj); + return constructObj; }; - const renderTeam = (cryp, iter, team) => { - const crypObj = this.cryps.children.entries - .find(c => c.cryp.id === cryp.id) - || renderCryp(cryp, iter, team); - crypObj.health.val = cryp.hp.value; - crypObj.red_shield.val = cryp.red_shield.value; - crypObj.blue_shield.val = cryp.red_shield.value; + const renderTeam = (construct, iter, team) => { + const constructObj = this.constructs.children.entries + .find(c => c.construct.id === construct.id) + || renderConstruct(construct, iter, team); + constructObj.health.val = construct.hp.value; + constructObj.red_shield.val = construct.red_shield.value; + constructObj.blue_shield.val = construct.red_shield.value; - crypObj.health.drawStatBar(); - crypObj.red_shield.drawStatBar(); - crypObj.blue_shield.drawStatBar(); - crypObj.effects.update(cryp.effects); + constructObj.health.drawStatBar(); + constructObj.red_shield.drawStatBar(); + constructObj.blue_shield.drawStatBar(); + constructObj.effects.update(construct.effects); }; const allyTeam = game.teams.find(t => t.id === this.account.id); // in future there will be more than one const [enemyTeam] = game.teams.filter(t => t.id !== this.account.id); - allyTeam.cryps.forEach((cryp, i) => renderTeam(cryp, i, 0)); + allyTeam.constructs.forEach((construct, i) => renderTeam(construct, i, 0)); if (!enemyTeam) return false; - enemyTeam.cryps.forEach((cryp, i) => renderTeam(cryp, i, 1)); + enemyTeam.constructs.forEach((construct, i) => renderTeam(construct, i, 1)); return true; } - selectCryp(crypId) { - this.cryps.children.entries.forEach(c => c.deselect()); - if (crypId) this.cryps.children.entries.find(c => c.cryp.id === crypId).select(); + selectConstruct(constructId) { + this.constructs.children.entries.forEach(c => c.deselect()); + if (constructId) this.constructs.children.entries.find(c => c.construct.id === constructId).select(); } - updateCrypStatus(status) { - const sourceCryp = this.cryps.children.entries - .find(c => c.cryp.id === status.id); + updateConstructStatus(status) { + const sourceConstruct = this.constructs.children.entries + .find(c => c.construct.id === status.id); - const targetCryp = this.cryps.children.entries - .find(c => c.cryp.id === status.target); + const targetConstruct = this.constructs.children.entries + .find(c => c.construct.id === status.target); if (this.phase === 'Skill') { - sourceCryp.statusText.text = `${status.skill} on ${targetCryp.cryp.name}`; + sourceConstruct.statusText.text = `${status.skill} on ${targetConstruct.construct.name}`; } } @@ -236,4 +236,4 @@ class CombatCryps extends Phaser.Scene { } } -module.exports = CombatCryps; +module.exports = CombatConstructs; diff --git a/phaser-client/src/scenes/combat.hitbox.js b/phaser-client/src/scenes/combat.hitbox.js index 392cbc0c..868fe5ce 100644 --- a/phaser-client/src/scenes/combat.hitbox.js +++ b/phaser-client/src/scenes/combat.hitbox.js @@ -1,14 +1,14 @@ const Phaser = require('phaser'); const { POSITIONS: { COMBAT } } = require('./constants'); -const CRYP_MARGIN = COMBAT.crypMargin(); -const BOX_HEIGHT = CRYP_MARGIN * 0.8; +const CONSTRUCT_MARGIN = COMBAT.constructMargin(); +const BOX_HEIGHT = CONSTRUCT_MARGIN * 0.8; const BOX_WIDTH = COMBAT.width() * 0.2; -class CrypHitBox extends Phaser.GameObjects.Rectangle { +class ConstructHitBox extends Phaser.GameObjects.Rectangle { constructor(scene, iter, team, cback) { - const y = COMBAT.y() + COMBAT.height() * 0.05 + CRYP_MARGIN * iter; + const y = COMBAT.y() + COMBAT.height() * 0.05 + CONSTRUCT_MARGIN * iter; super(scene, (COMBAT.width() - BOX_WIDTH) * team, y, BOX_WIDTH, BOX_HEIGHT, 0x222222); this.setOrigin(0); this.clickHandler = () => cback(); @@ -59,22 +59,22 @@ class CombatHitBox extends Phaser.Scene { skillHitBox(game) { const account = this.registry.get('account'); - const group = this.scene.get('CombatCryps').cryps; + const group = this.scene.get('CombatConstructs').constructs; const skillScene = this.scene.get('CombatSkills'); game.teams.forEach((t) => { - t.cryps.forEach((c) => { + t.constructs.forEach((c) => { const cback = () => { const { activeSkill } = skillScene; if (activeSkill) { - this.scene.get('CombatSkills').clearCrypActive(activeSkill.cryp.id); + this.scene.get('CombatSkills').clearConstructActive(activeSkill.construct.id); activeSkill.activate(); skillScene.activeSkill = null; - this.game.events.emit('SEND_SKILL', game.id, activeSkill.cryp.id, c.id, activeSkill.skill.skill); + this.game.events.emit('SEND_SKILL', game.id, activeSkill.construct.id, c.id, activeSkill.skill.skill); } }; - const crypSpawn = group.children.entries.find(s => s.cryp.id === c.id); + const constructSpawn = group.children.entries.find(s => s.construct.id === c.id); const team = c.account === account.id ? 0 : 1; - if (crypSpawn) this.add.existing(new CrypHitBox(this, crypSpawn.iter, team, cback)); + if (constructSpawn) this.add.existing(new ConstructHitBox(this, constructSpawn.iter, team, cback)); }); }); this.scene.moveBelow('Combat'); diff --git a/phaser-client/src/scenes/combat.js b/phaser-client/src/scenes/combat.js index dd8a39a9..1c520c60 100644 --- a/phaser-client/src/scenes/combat.js +++ b/phaser-client/src/scenes/combat.js @@ -3,7 +3,7 @@ const { throttle } = require('lodash'); const { TEXT, POSITIONS: { COMBAT } } = require('./constants'); const CombatLog = require('./combat.log'); -const CombatCryps = require('./combat.cryps'); +const CombatConstructs = require('./combat.constructs'); const CombatSkills = require('./combat.skills'); const CombatHitBox = require('./combat.hitbox'); @@ -47,7 +47,7 @@ class Combat extends Phaser.Scene { } startGame(game) { - this.scene.manager.add('CombatCryps', CombatCryps, true, game); + this.scene.manager.add('CombatConstructs', CombatConstructs, true, game); this.scene.manager.add('CombatLog', CombatLog, true, game); this.renderedResolves = game.resolved.length; // In case you rejoin mid way this.scene.manager.add('CombatSkills', CombatSkills, true, game.phase); @@ -79,7 +79,7 @@ class Combat extends Phaser.Scene { } checkAnimation(game) { - // Check cryps are loaded and whether game is animating + // Check constructs are loaded and whether game is animating const cantAnimate = this.registry.get('gamePhase') === 'animating'; if (cantAnimate) return false; if (game.resolved.length !== this.renderedResolves) { @@ -125,7 +125,7 @@ class Combat extends Phaser.Scene { this.registry.set('menu', true); this.registry.set('game', null); - const ACTIVE_SCENES = ['CombatLog', 'CombatCryps', 'CombatSkills', 'CombatHitBox']; + const ACTIVE_SCENES = ['CombatLog', 'CombatConstructs', 'CombatSkills', 'CombatHitBox']; ACTIVE_SCENES.forEach((sKey) => { if (this.scene.get(sKey)) this.scene.get(sKey).cleanUp(); }); diff --git a/phaser-client/src/scenes/combat.render.resolutions.js b/phaser-client/src/scenes/combat.render.resolutions.js index 5ab6918d..77ceed62 100644 --- a/phaser-client/src/scenes/combat.render.resolutions.js +++ b/phaser-client/src/scenes/combat.render.resolutions.js @@ -6,23 +6,23 @@ const { POSITIONS: { COMBAT }, } = require('./constants'); -function findResolutionCryps(scene, group, resolution, game) { - const sourceSpawn = group.children.entries.find(c => c.cryp.id === resolution.source.id); +function findResolutionConstructs(scene, group, resolution, game) { + const sourceSpawn = group.children.entries.find(c => c.construct.id === resolution.source.id); -/* const sourceCryp = game.teams.find(t => t.cryps.find(c => c.id === resolution.source_cryp_id)) - .cryps.find(c => c.id === resolution.source_cryp_id); +/* const sourceConstruct = game.teams.find(t => t.constructs.find(c => c.id === resolution.source_construct_id)) + .constructs.find(c => c.id === resolution.source_construct_id); - const targetCryp = game.teams.find(t => t.cryps.find(c => c.id === resolution.target_cryp_id)) - .cryps.find(c => c.id === resolution.target_cryp_id); + const targetConstruct = game.teams.find(t => t.constructs.find(c => c.id === resolution.target_construct_id)) + .constructs.find(c => c.id === resolution.target_construct_id); */ - const targetSpawn = group.children.entries.find(c => c.cryp.id === resolution.target.id); + const targetSpawn = group.children.entries.find(c => c.construct.id === resolution.target.id); return { sourceSpawn, targetSpawn }; } function calculateTweenParams(sourceSpawn, targetSpawn, account, skill) { const tweenParams = (targets, centreSpot) => { - const enemy = targets.cryp.account !== account.id; + const enemy = targets.construct.account !== account.id; let x = centreSpot ? COMBAT.width() * 0.3 : targets.x; x = (enemy && centreSpot) ? x + COMBAT.width() * 0.4 : x; const y = centreSpot ? COMBAT.height() * 13.25 / 35 : targets.y; @@ -36,7 +36,7 @@ function calculateTweenParams(sourceSpawn, targetSpawn, account, skill) { let moveSourceOrig = false; const targetOnlySkill = ['DecayTick']; if (!(targetOnlySkill.includes(skill))) { - if (sourceSpawn.cryp.account !== targetSpawn.cryp.account) { + if (sourceSpawn.construct.account !== targetSpawn.construct.account) { moveSourceBattle = tweenParams(sourceSpawn, true); moveSourceOrig = tweenParams(sourceSpawn, false); } @@ -57,12 +57,12 @@ function animatePhase(scene, game, resolution, cb) { || resolution.event[0] === 'TargetKo' || resolution.event === 'Ko') return cb(); - const group = scene.scene.get('CombatCryps').cryps; + const group = scene.scene.get('CombatConstructs').constructs; const animations = new CombatAnimations(scene); const account = scene.registry.get('account'); - // Find cryps, targets - const { sourceSpawn, targetSpawn } = findResolutionCryps(scene, group, resolution, game); + // Find constructs, targets + const { sourceSpawn, targetSpawn } = findResolutionConstructs(scene, group, resolution, game); const { moveSourceBattle, moveSourceOrig, moveTargetBattle, moveTargetOrig, } = calculateTweenParams(sourceSpawn, targetSpawn, account, resolution.event[1].skill); @@ -74,16 +74,16 @@ function animatePhase(scene, game, resolution, cb) { }; const castLocation = castParams(); - // Move cryps into position + // Move constructs into position if (moveSourceBattle) scene.tweens.add(moveSourceBattle); scene.tweens.add(moveTargetBattle); return scene.time.delayedCall(MOVE_CREEP, () => { - const sourceAlly = sourceSpawn.cryp.account === account.id; - const targetAlly = targetSpawn.cryp.account === account.id; + const sourceAlly = sourceSpawn.construct.account === account.id; + const targetAlly = targetSpawn.construct.account === account.id; // animate animation animations.getSkill(resolution.event[1].skill, sourceAlly, targetAlly, castLocation); - // Target cryp takes damage + // Target construct takes damage scene.time.delayedCall(ANIMATION_DURATION, () => { console.log(resolution); if (resolution.event[0] === 'Damage') { diff --git a/phaser-client/src/scenes/combat.skills.js b/phaser-client/src/scenes/combat.skills.js index b65afa4b..7b0ac765 100644 --- a/phaser-client/src/scenes/combat.skills.js +++ b/phaser-client/src/scenes/combat.skills.js @@ -2,18 +2,18 @@ const Phaser = require('phaser'); const { TEXT, POSITIONS: { COMBAT } } = require('./constants'); -const CRYP_KEY_MAP = ['keydown_ONE', 'keydown_TWO', 'keydown_THREE']; +const CONSTRUCT_KEY_MAP = ['keydown_ONE', 'keydown_TWO', 'keydown_THREE']; const SKILL_KEY_MAP = ['keydown_Q', 'keydown_W', 'keydown_E', 'keydown_R']; const TARGET_KEY_MAP = ['keydown_SEVEN', 'keydown_EIGHT', 'keydown_NINE', 'keydown_ZERO']; -const CRYP_MARGIN = COMBAT.crypMargin(); +const CONSTRUCT_MARGIN = COMBAT.constructMargin(); const TEXT_MARGIN = COMBAT.textMargin(); const SKILL_WIDTH = COMBAT.width() / 10; const SKILL_HEIGHT = COMBAT.height() / 30; -const skillPosition = (crypIter, skillIter) => { +const skillPosition = (constructIter, skillIter) => { const skillTextX = COMBAT.width() / 3.8; - const skillTextY = (TEXT_MARGIN * skillIter) * 1.5 + CRYP_MARGIN * crypIter + COMBAT.y() + COMBAT.height() * 0.07; + const skillTextY = (TEXT_MARGIN * skillIter) * 1.5 + CONSTRUCT_MARGIN * constructIter + COMBAT.y() + COMBAT.height() * 0.07; return [skillTextX, skillTextY]; }; @@ -28,9 +28,9 @@ const skillCheckHitBox = (scenePlugin, pointer) => { return false; }; -class CrypSkill extends Phaser.GameObjects.Container { - constructor(scene, x, y, skill, cryp) { - // Avatar will be a property of cryp +class ConstructSkill extends Phaser.GameObjects.Container { + constructor(scene, x, y, skill, construct) { + // Avatar will be a property of construct super(scene, x, y); const CD_TEXT = skill.cd ? `(${skill.cd}T)` : ''; const SKILL_TEXT = `${skill.skill} ${CD_TEXT}`; @@ -42,7 +42,7 @@ class CrypSkill extends Phaser.GameObjects.Container { this.add(this.skillText); this.state = 'deselect'; - this.cryp = cryp; + this.construct = construct; this.skill = skill; this.scene = scene; @@ -117,7 +117,7 @@ class CombatSkills extends Phaser.Scene { if (key === 'gamePhase' && data) { const shouldUpdate = data !== this.phase; if (shouldUpdate) { - this.scene.get('CombatCryps').selectCryp(null); + this.scene.get('CombatConstructs').selectConstruct(null); return this.scene.restart(data); } return false; @@ -135,9 +135,9 @@ class CombatSkills extends Phaser.Scene { const { keyboard } = this.input; const { events } = this.game; - const addSkill = (i, j, skill, cryp) => { + const addSkill = (i, j, skill, construct) => { const skillTextPos = skillPosition(i, j); - const skillObj = new CrypSkill(this, skillTextPos[0], skillTextPos[1], skill, cryp); + const skillObj = new ConstructSkill(this, skillTextPos[0], skillTextPos[1], skill, construct); if (skill.cd) { skillObj.skillBox.setFillStyle(0x9d9ea0); } else { @@ -150,22 +150,22 @@ class CombatSkills extends Phaser.Scene { const team = game.teams.find(t => t.id === account.id); const enemyTeam = game.teams.find(t => t.id !== account.id); - team.cryps.forEach((cryp) => { + team.constructs.forEach((construct) => { // return early if KOd - if (cryp.hp.value === 0) return true; + if (construct.hp.value === 0) return true; - // find the cryp position - const { iter } = this.scene.get('CombatCryps').cryps.children.entries.find(c => c.cryp.id === cryp.id); + // find the construct position + const { iter } = this.scene.get('CombatConstructs').constructs.children.entries.find(c => c.construct.id === construct.id); // draw the skills - const skillButtons = cryp.skills.map((skill, j) => addSkill(iter, j, skill, cryp)); + const skillButtons = construct.skills.map((skill, j) => addSkill(iter, j, skill, construct)); - const bindCrypKeys = () => this.mapSkillKeys(skillButtons, game.id, cryp.id, team.id, enemyTeam.id, iter); + const bindConstructKeys = () => this.mapSkillKeys(skillButtons, game.id, construct.id, team.id, enemyTeam.id, iter); // reset everything - keyboard.on('keydown_ESC', bindCrypKeys, this); - events.on('SEND_SKILL', bindCrypKeys, this); - bindCrypKeys(); + keyboard.on('keydown_ESC', bindConstructKeys, this); + events.on('SEND_SKILL', bindConstructKeys, this); + bindConstructKeys(); return true; }); @@ -174,16 +174,16 @@ class CombatSkills extends Phaser.Scene { } // FIXME - // needs to send crypId not team - mapSkillKeys(skillButtons, gameId, crypId, alliesId, enemyId, i) { + // needs to send constructId not team + mapSkillKeys(skillButtons, gameId, constructId, alliesId, enemyId, i) { const { keyboard } = this.input; - keyboard.removeListener(CRYP_KEY_MAP[i]); + keyboard.removeListener(CONSTRUCT_KEY_MAP[i]); - keyboard.on(CRYP_KEY_MAP[i], () => { + keyboard.on(CONSTRUCT_KEY_MAP[i], () => { SKILL_KEY_MAP.forEach(k => keyboard.removeListener(k)); - this.scene.get('CombatCryps').selectCryp(crypId); + this.scene.get('CombatConstructs').selectConstruct(constructId); skillButtons.forEach((button, j) => { keyboard.on(SKILL_KEY_MAP[j], () => { @@ -191,21 +191,21 @@ class CombatSkills extends Phaser.Scene { button.select(); // clear existing keys - CRYP_KEY_MAP.forEach(k => keyboard.removeListener(k)); + CONSTRUCT_KEY_MAP.forEach(k => keyboard.removeListener(k)); TARGET_KEY_MAP.forEach(k => keyboard.removeListener(k)); - CRYP_KEY_MAP.forEach(k => keyboard.on(k, () => { - this.clearCrypActive(crypId); + CONSTRUCT_KEY_MAP.forEach(k => keyboard.on(k, () => { + this.clearConstructActive(constructId); button.activate(); this.activeSkill = null; - this.game.events.emit('SEND_SKILL', gameId, crypId, alliesId, button.skill.skill); + this.game.events.emit('SEND_SKILL', gameId, constructId, alliesId, button.skill.skill); })); TARGET_KEY_MAP.forEach(k => keyboard.on(k, () => { - this.clearCrypActive(crypId); + this.clearConstructActive(constructId); button.activate(); this.activeSkill = null; - this.game.events.emit('SEND_SKILL', gameId, crypId, enemyId, button.skill.skill); + this.game.events.emit('SEND_SKILL', gameId, constructId, enemyId, button.skill.skill); })); }, this); }); @@ -214,15 +214,15 @@ class CombatSkills extends Phaser.Scene { return true; } - clearCrypActive(crypId) { + clearConstructActive(constructId) { this.scene.scene.children.list.forEach((s) => { - if (s.cryp.id === crypId && s.state === 'activate') s.deselect(); + if (s.construct.id === constructId && s.state === 'activate') s.deselect(); }); } clearKeys() { TARGET_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); - CRYP_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); + CONSTRUCT_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); SKILL_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); } diff --git a/phaser-client/src/scenes/constants.js b/phaser-client/src/scenes/constants.js index 8c48cf3b..ffe0b475 100644 --- a/phaser-client/src/scenes/constants.js +++ b/phaser-client/src/scenes/constants.js @@ -7,10 +7,10 @@ const CANVAS_HEIGHT = () => Math.floor(window.innerHeight); const headerWidth = () => CANVAS_WIDTH(); const headerHeight = () => Math.floor(CANVAS_HEIGHT() * 0.05); -const menuCrypListWidth = () => Math.floor(CANVAS_WIDTH() * 0.3); -const menuCrypListHeight = () => Math.floor(CANVAS_HEIGHT() - headerHeight()); -const menuCrypListX = () => Math.floor(CANVAS_WIDTH() * 0.3); -const menuCrypListY = () => headerHeight(); +const menuConstructListWidth = () => Math.floor(CANVAS_WIDTH() * 0.3); +const menuConstructListHeight = () => Math.floor(CANVAS_HEIGHT() - headerHeight()); +const menuConstructListX = () => Math.floor(CANVAS_WIDTH() * 0.3); +const menuConstructListY = () => headerHeight(); const itemListWidth = () => Math.floor(CANVAS_WIDTH() * 0.5); const itemListHeight = () => Math.floor(CANVAS_HEIGHT() * 0.95); @@ -38,13 +38,13 @@ const combatWidth = () => CANVAS_WIDTH(); const combatHeight = () => CANVAS_HEIGHT() - headerHeight(); const combatY = () => headerHeight(); const combatX = () => 0; -const combatCrypMargin = () => Math.floor((CANVAS_HEIGHT() - headerHeight()) / 4.5); +const combatConstructMargin = () => Math.floor((CANVAS_HEIGHT() - headerHeight()) / 4.5); const combatTextMargin = () => Math.floor((CANVAS_HEIGHT() - headerHeight()) / 35); -const statsWidth = () => Math.floor(CANVAS_WIDTH() - menuCrypListWidth()); +const statsWidth = () => Math.floor(CANVAS_WIDTH() - menuConstructListWidth()); const statsHeight = () => CANVAS_HEIGHT() - headerHeight(); const statsY = () => headerHeight(); -const statsX = () => menuCrypListWidth(); +const statsX = () => menuConstructListWidth(); const statsKnownX = () => Math.floor(statsX() + statsWidth() / 4); const statsLearnableX = () => Math.floor(statsX() + statsWidth() / 2); const statsTextMargin = () => 24; @@ -70,11 +70,11 @@ module.exports = { height: headerHeight, }, - CRYP_LIST: { - x: menuCrypListX, - y: menuCrypListY, - width: menuCrypListWidth, - height: menuCrypListHeight, + CONSTRUCT_LIST: { + x: menuConstructListX, + y: menuConstructListY, + width: menuConstructListWidth, + height: menuConstructListHeight, }, MENU_MAIN: { @@ -127,7 +127,7 @@ module.exports = { y: combatY, width: combatWidth, height: combatHeight, - crypMargin: combatCrypMargin, + constructMargin: combatConstructMargin, textMargin: combatTextMargin, @@ -172,7 +172,7 @@ module.exports = { ITEMS: { SKILLS: { Amplify: { - description: 'increase the magic damage dealt by a cryp', + description: 'increase the magic damage dealt by a construct', colours: '1 Green 1 Blue', }, @@ -182,7 +182,7 @@ module.exports = { }, Banish: { - description: 'target cryp is prevented from casting any skills and taking any damage', + description: 'target construct is prevented from casting any skills and taking any damage', colours: '1 Red 1 Green', }, @@ -198,7 +198,7 @@ module.exports = { }, Buff: { - description: 'increase target cryp speed', + description: 'increase target construct speed', upgrades: 'combine with 2 red / blue / green', }, @@ -213,42 +213,42 @@ module.exports = { }, Curse: { - description: 'target cryp takes increased magic damage', + description: 'target construct takes increased magic damage', colours: '2 Blue', }, Debuff: { - description: 'reduce target cryp speed', + description: 'reduce target construct speed', upgrades: 'combine with 2 red / blue / green', }, Decay: { - description: 'afflict a cryp with a blue damage based damage over time debuff', + description: 'afflict a construct with a blue damage based damage over time debuff', colours: '1 Green 1 Blue', }, Empower: { - description: 'increase the red damage dealt by a cryp', + description: 'increase the red damage dealt by a construct', colours: '2 Red', }, Haste: { - description: 'magical skill that increases speed of target cryp', + description: 'magical skill that increases speed of target construct', colours: '1 Red 1 Blue', }, Heal: { - description: 'heal a cryp with blue damage', + description: 'heal a construct with blue damage', colours: '2 Green', }, Hex: { - description: 'magical bsed skill that prevents target cryp from using any skills', + description: 'magical bsed skill that prevents target construct from using any skills', colours: '1 Red 1 Blue', }, Hostility: { - description: 'magical bsed skill that prevents target cryp from using any skills', + description: 'magical bsed skill that prevents target construct from using any skills', colours: '2 Blue', }, @@ -263,12 +263,12 @@ module.exports = { }, Purge: { - description: 'remove magical buffs from target cryp', + description: 'remove magical buffs from target construct', colours: '2 Green', }, Purify: { - description: 'remove magical debuffs from target cryp', + description: 'remove magical debuffs from target construct', colours: '1 Red 1 Green', }, @@ -292,17 +292,17 @@ module.exports = { }, Shield: { - description: 'grants immunity to magical skills to target cryp', + description: 'grants immunity to magical skills to target construct', colours: '1 Green 1 Blue', }, Silence: { - description: 'prevent target cryp from casting magical skills', + description: 'prevent target construct from casting magical skills', colours: '1 Green 1 Blue', }, Siphon: { - description: 'siphon hp from target cryp with a blue damage based debuff', + description: 'siphon hp from target construct with a blue damage based debuff', colours: '1 Green 1 Blue', }, @@ -311,7 +311,7 @@ module.exports = { }, Slow: { - description: 'magical skill that reduces speed of target cryp', + description: 'magical skill that reduces speed of target construct', colours: '1 Red 1 Green', }, @@ -331,13 +331,13 @@ module.exports = { }, Stun: { - description: 'red skill hat prevents target cryp from using any skills', + description: 'red skill hat prevents target construct from using any skills', upgrades: 'combine with 2 red / blue / green', }, Taunt: { - description: 'Enemy skills will prioritise cryps with this skill active', + description: 'Enemy skills will prioritise constructs with this skill active', colours: '1 Red 1 Green', }, @@ -354,19 +354,19 @@ module.exports = { SPECS: { Damage: { - description: 'Increase red / green / blue power stats cryp', + description: 'Increase red / green / blue power stats construct', upgrades: 'combine with 2 red / blue / green', }, Hp: { - description: 'Increases health of cryp', + description: 'Increases health of construct', upgrades: 'combine with 2 red / blue / green', }, Speed: { - description: 'Increases speed of cryp', + description: 'Increases speed of construct', upgrades: 'combine with 2 red / blue / green', }, }, diff --git a/phaser-client/src/scenes/cryps.js b/phaser-client/src/scenes/cryps.js index b63c0512..c1fd95e9 100644 --- a/phaser-client/src/scenes/cryps.js +++ b/phaser-client/src/scenes/cryps.js @@ -7,7 +7,7 @@ const Combat = require('./combat'); // const Background = require('./background'); -function renderCryps() { +function renderConstructs() { const config = { type: Phaser.CANVAS, // backgroundColor: '#181818', @@ -74,4 +74,4 @@ function renderCryps() { return game; } -module.exports = renderCryps; +module.exports = renderConstructs; diff --git a/phaser-client/src/scenes/elements/combat.statbar.js b/phaser-client/src/scenes/elements/combat.statbar.js index 7189e945..c85d10a1 100644 --- a/phaser-client/src/scenes/elements/combat.statbar.js +++ b/phaser-client/src/scenes/elements/combat.statbar.js @@ -1,49 +1,49 @@ const Phaser = require('phaser'); const { TEXT, POSITIONS: { COMBAT }, COLOURS } = require('.././constants'); -const CRYP_MARGIN = COMBAT.crypMargin(); +const CONSTRUCT_MARGIN = COMBAT.constructMargin(); const TEXT_MARGIN = COMBAT.textMargin(); const statBarDimensions = (team, iter, margin) => { const statBarWidth = COMBAT.width() * 0.07; const statBarHeight = TEXT_MARGIN / 1.5; const statBarX = (COMBAT.width() - statBarWidth) * team; - const statBarY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CRYP_MARGIN * iter + COMBAT.height() * 0.07; + const statBarY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; return { statBarX, statBarY, statBarWidth, statBarHeight }; }; const statTextCoord = (team, iter, margin) => { const statTextX = team ? COMBAT.width() - COMBAT.width() * 0.075 : COMBAT.width() * 0.075; - const statTextY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CRYP_MARGIN * iter + COMBAT.height() * 0.07; + const statTextY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; return { statTextX, statTextY }; }; class StatBar extends Phaser.GameObjects.Graphics { - constructor(scene, cryp, type) { + constructor(scene, construct, type) { super(scene); - this.crypObj = cryp; + this.constructObj = construct; this.type = type; if (type === 'HP') { - this.val = this.crypObj.cryp.hp.value; - this.max = this.crypObj.cryp.hp.max; + this.val = this.constructObj.construct.hp.value; + this.max = this.constructObj.construct.hp.max; this.margin = 0; } else if (type === 'Red Shield') { - this.val = this.crypObj.cryp.red_shield.value; - this.max = this.crypObj.cryp.red_shield.max; + this.val = this.constructObj.construct.red_shield.value; + this.max = this.constructObj.construct.red_shield.max; this.margin = 1; } else if (type === 'Blue Shield') { - this.val = this.crypObj.cryp.blue_shield.value; - this.max = this.crypObj.cryp.blue_shield.max; + this.val = this.constructObj.construct.blue_shield.value; + this.max = this.constructObj.construct.blue_shield.max; this.margin = 2; } else if (type === 'Evasion') { - this.val = this.crypObj.cryp.evasion.value; - this.max = this.crypObj.cryp.evasion.max; + this.val = this.constructObj.construct.evasion.value; + this.max = this.constructObj.construct.evasion.max; this.margin = 3; } - const { statTextX, statTextY } = statTextCoord(cryp.team, cryp.iter, this.margin); - this.statText = scene.add.text(statTextX, statTextY, '', TEXT.NORMAL).setOrigin(cryp.team, 0); + const { statTextX, statTextY } = statTextCoord(construct.team, construct.iter, this.margin); + this.statText = scene.add.text(statTextX, statTextY, '', TEXT.NORMAL).setOrigin(construct.team, 0); this.drawStatBar(); } @@ -51,7 +51,7 @@ class StatBar extends Phaser.GameObjects.Graphics { this.clear(); const { statBarX, statBarY, statBarWidth, statBarHeight, - } = statBarDimensions(this.crypObj.team, this.crypObj.iter, this.margin); + } = statBarDimensions(this.constructObj.team, this.constructObj.iter, this.margin); this.statText.text = `${this.val.toString()} / ${this.max.toString()} ${this.type}`; // Draw Black Border this.fillStyle(COLOURS.BLACK); @@ -78,7 +78,7 @@ class StatBar extends Phaser.GameObjects.Graphics { } else { this.val = (this.val - value > this.max) ? this.max : this.val -= value; } - if (this.val === 0 && this.type === 'HP') this.crypObj.setKo(); + if (this.val === 0 && this.type === 'HP') this.constructObj.setKo(); this.drawStatBar(); } } diff --git a/phaser-client/src/scenes/game.list.js b/phaser-client/src/scenes/game.list.js index cdb16b06..d436770b 100644 --- a/phaser-client/src/scenes/game.list.js +++ b/phaser-client/src/scenes/game.list.js @@ -27,15 +27,15 @@ class GameList extends Phaser.Scene { .setInteractive() .setOrigin(0); - const TITLE = `${game.teams[0].cryps.map(c => c.name).join(', ')} - ${game.team_size}v${game.team_size}`; + const TITLE = `${game.teams[0].constructs.map(c => c.name).join(', ')} - ${game.team_size}v${game.team_size}`; this.add .text(gameBox.getCenter().x, gameBox.getCenter().y, TITLE, TEXT.NORMAL) .setOrigin(0.5, 0.5); gameBox.on('pointerdown', () => { - const cryps = this.registry.get('cryps'); - const team = cryps.filter(c => c.active).map(c => c.id); + const constructs = this.registry.get('constructs'); + const team = constructs.filter(c => c.active).map(c => c.id); ws.sendGameJoin(game.id, team); }); }; diff --git a/phaser-client/src/scenes/header.js b/phaser-client/src/scenes/header.js index f2cd78e3..c6c31c05 100644 --- a/phaser-client/src/scenes/header.js +++ b/phaser-client/src/scenes/header.js @@ -20,7 +20,7 @@ class Header extends Phaser.Scene { } create() { - this.add.text(0, 0, 'cryps.gg', TEXT.HEADER); + this.add.text(0, 0, 'constructs.gg', TEXT.HEADER); } } diff --git a/phaser-client/src/scenes/home.cryps.js b/phaser-client/src/scenes/home.cryps.js index f112dba1..c0620d11 100644 --- a/phaser-client/src/scenes/home.cryps.js +++ b/phaser-client/src/scenes/home.cryps.js @@ -1,14 +1,14 @@ const Phaser = require('phaser'); const { remove } = require('lodash'); -const { TEXT, COLOURS, POSITIONS: { CRYP_LIST } } = require('./constants'); +const { TEXT, COLOURS, POSITIONS: { CONSTRUCT_LIST } } = require('./constants'); const genAvatar = require('./avatar'); const { LineGroup, LineBox } = require('./elements/outline.rotate'); -const ROW_HEIGHT = CRYP_LIST.height() * 0.1; -const ROW_WIDTH = CRYP_LIST.width(); +const ROW_HEIGHT = CONSTRUCT_LIST.height() * 0.1; +const ROW_WIDTH = CONSTRUCT_LIST.width(); -const menuY = CRYP_LIST.height() * 0.8; +const menuY = CONSTRUCT_LIST.height() * 0.8; const KEY_MAP = [ 'keydown-ONE', @@ -18,41 +18,41 @@ const KEY_MAP = [ const NULL_UUID = '00000000-0000-0000-0000-000000000000'; -class HomeCrypList extends Phaser.Scene { +class HomeConstructList extends Phaser.Scene { constructor() { - super({ key: 'HomeCryps' }); + super({ key: 'HomeConstructs' }); } updateData(parent, key, data) { - if (key === 'crypList') { + if (key === 'constructList') { KEY_MAP.forEach(k => this.input.keyboard.removeListener(k)); this.scene.restart(); } } create() { - // this.cameras.main.setViewport(CRYP_LIST.x(), CRYP_LIST.y(), CRYP_LIST.width(), CRYP_LIST.height()); + // this.cameras.main.setViewport(CONSTRUCT_LIST.x(), CONSTRUCT_LIST.y(), CONSTRUCT_LIST.width(), CONSTRUCT_LIST.height()); this.registry.events.on('changedata', this.updateData, this); this.registry.events.on('setdata', this.updateData, this); - const cryps = this.registry.get('crypList'); + const constructs = this.registry.get('constructList'); const lineGroup = this.add.existing(new LineGroup(this)); - if (!cryps) return true; + if (!constructs) return true; const ws = this.registry.get('ws'); - this.activeCryps = []; - // We only display 3 cryps others can be viewed in cryp list (soon TM) - for (let i = 0; i < cryps.length; i += 1) { - const cryp = cryps[i]; + this.activeConstructs = []; + // We only display 3 constructs others can be viewed in construct list (soon TM) + for (let i = 0; i < constructs.length; i += 1) { + const construct = constructs[i]; const BOX_WIDTH = Math.floor(ROW_WIDTH / 5); const ROW_X = BOX_WIDTH * 2 * (i % 3); - const ROW_Y = CRYP_LIST.y() + (Math.floor(i / 3)) * ROW_HEIGHT * 1.5; + const ROW_Y = CONSTRUCT_LIST.y() + (Math.floor(i / 3)) * ROW_HEIGHT * 1.5; const ACTIVE_FILL = 0.2; const FILL = Object.values(COLOURS)[i]; - // Selection of cryps + // Selection of constructs - // Cryp avatar and interaction box + // Construct avatar and interaction box const cReady = this.add .rectangle(ROW_X, ROW_Y + ROW_HEIGHT * 0.2, BOX_WIDTH * 2, ROW_HEIGHT, FILL) .setInteractive() @@ -60,11 +60,11 @@ class HomeCrypList extends Phaser.Scene { cReady.setAlpha(0.2); cReady.on('pointerdown', () => { lineGroup.clear(true, true); - if (this.activeCryps.includes(cReady)) { - remove(this.activeCryps, n => n === cReady); + if (this.activeConstructs.includes(cReady)) { + remove(this.activeConstructs, n => n === cReady); cReady.setAlpha(0.2); } else { - this.activeCryps.push(cReady); + this.activeConstructs.push(cReady); cReady.setAlpha(0.75); lineGroup.add(this.add.existing( new LineBox(this, cReady.x, cReady.y, cReady.width, cReady.height, cReady.fillColor, 3) @@ -79,24 +79,24 @@ class HomeCrypList extends Phaser.Scene { cReady.setFillStyle(FILL, ACTIVE_FILL); }; - cReady.cryp = cryp; + cReady.construct = construct; this.add.image( cReady.getCenter().x, cReady.getCenter().y, 'aztec', - genAvatar(cryp.name) + genAvatar(construct.name) ); - this.add.text(ROW_X + BOX_WIDTH, ROW_Y, cryp.name, TEXT.HEADER) + this.add.text(ROW_X + BOX_WIDTH, ROW_Y, construct.name, TEXT.HEADER) .setOrigin(0.5, 0.5); } - // Add Spawn Cryp Option + // Add Spawn Construct Option const spawn = this.add .rectangle(ROW_WIDTH * 0.05, menuY, ROW_WIDTH * 0.2, ROW_HEIGHT * 0.5, 0x888888) .setInteractive() .setOrigin(0) .on('pointerdown', () => { - this.game.events.emit('CRYP_SPAWN'); + this.game.events.emit('CONSTRUCT_SPAWN'); }); this.add .text(spawn.getCenter().x, spawn.getCenter().y, '+', TEXT.HEADER) @@ -107,9 +107,9 @@ class HomeCrypList extends Phaser.Scene { .setInteractive() .setOrigin(0) .on('pointerdown', () => { - const playerCryps = []; - this.activeCryps.forEach(obj => playerCryps.push(obj.cryp.id)); - ws.sendPlayerCrypsSet(NULL_UUID, playerCryps); + const playerConstructs = []; + this.activeConstructs.forEach(obj => playerConstructs.push(obj.construct.id)); + ws.sendPlayerConstructsSet(NULL_UUID, playerConstructs); }); this.add .text(joinNormal.getCenter().x, joinNormal.getCenter().y, 'Join Normal', TEXT.HEADER) @@ -120,9 +120,9 @@ class HomeCrypList extends Phaser.Scene { .setInteractive() .setOrigin(0) .on('pointerdown', () => { - const playerCryps = []; - this.activeCryps.forEach(obj => playerCryps.push(obj.cryp.id)); - ws.sendInstanceJoin(playerCryps); + const playerConstructs = []; + this.activeConstructs.forEach(obj => playerConstructs.push(obj.construct.id)); + ws.sendInstanceJoin(playerConstructs); }); this.add .text(joinInstance.getCenter().x, joinInstance.getCenter().y, 'New Instance', TEXT.HEADER) @@ -139,4 +139,4 @@ class HomeCrypList extends Phaser.Scene { } } -module.exports = HomeCrypList; +module.exports = HomeConstructList; diff --git a/phaser-client/src/scenes/home.js b/phaser-client/src/scenes/home.js index 175fa4a4..fb03e009 100644 --- a/phaser-client/src/scenes/home.js +++ b/phaser-client/src/scenes/home.js @@ -1,7 +1,7 @@ const Phaser = require('phaser'); -const HomeCryps = require('./home.cryps'); +const HomeConstructs = require('./home.constructs'); const HomeNavigation = require('./home.navigation'); const HomeRankings = require('./home.rankings'); @@ -10,7 +10,7 @@ const HomeShop = require('./home.shop'); const HomeInstances = require('./home.instances'); const FIXED_SCENES = [ - 'HomeCryps', + 'HomeConstructs', 'HomeNavigation', ]; @@ -31,7 +31,7 @@ class Home extends Phaser.Scene { this.registry.events.on('changedata', this.updateData, this); this.registry.events.on('setdata', this.updateData, this); - this.scene.manager.add('HomeCryps', HomeCryps, true); + this.scene.manager.add('HomeConstructs', HomeConstructs, true); this.scene.manager.add('HomeNavigation', HomeNavigation, true); diff --git a/phaser-client/src/scenes/item.info.js b/phaser-client/src/scenes/item.info.js index 077e4c6e..0e116ae3 100644 --- a/phaser-client/src/scenes/item.info.js +++ b/phaser-client/src/scenes/item.info.js @@ -16,7 +16,7 @@ class ItemInfo extends Phaser.Scene { } create(props) { - const { item, cryp } = props; + const { item, construct } = props; if (!item) return false; // Default item text @@ -51,19 +51,19 @@ class ItemInfo extends Phaser.Scene { .setWordWrapWidth(WIDTH * 0.75); if (colours !== '') { this.add - .text(X, Y + HEIGHT * 0.35, `Adds ${colours} to cryp`, TEXT.NORMAL) + .text(X, Y + HEIGHT * 0.35, `Adds ${colours} to construct`, TEXT.NORMAL) .setWordWrapWidth(WIDTH * 0.75); } - if (!cryp) return true; + if (!construct) return true; const ws = this.registry.get('ws'); const { vbox } = this.registry.get('player'); const unEquip = this.add.rectangle(X, UNEQUIP_Y, UNEQUIP_WIDTH, UNEQUIP_HEIGHT, 0x222222) .setOrigin(0, 0) .setInteractive() .on('pointerdown', () => { - ws.sendVboxUnequip(vbox.instance, cryp.id, item); - this.registry.set('crypStats', cryp); + ws.sendVboxUnequip(vbox.instance, construct.id, item); + this.registry.set('constructStats', construct); }); this.add.text(unEquip.getCenter().x, unEquip.getCenter().y, 'unequip', TEXT.HEADER) .setOrigin(0.5, 0.5); diff --git a/phaser-client/src/scenes/item.list.js b/phaser-client/src/scenes/item.list.js index c8d422b4..74758520 100644 --- a/phaser-client/src/scenes/item.list.js +++ b/phaser-client/src/scenes/item.list.js @@ -109,8 +109,8 @@ class DeleteHitBox extends Phaser.GameObjects.Rectangle { const itemCheckHitbox = (scene, pointer) => { - const { list } = scene.scene.get('MenuCrypList').children; - const hitboxes = list.filter(c => c.cryp) + const { list } = scene.scene.get('MenuConstructList').children; + const hitboxes = list.filter(c => c.construct) .concat(scene.children.list.filter(c => c instanceof CombinerHitBox || c instanceof DeleteHitBox)); let found; @@ -283,7 +283,7 @@ class ItemList extends Phaser.Scene { // Check first for hitbox interaction const hitBox = itemCheckHitbox(this, pointer); if (hitBox) { - // hitbox can only be the combinerhitbox, deletehitbox or cryp avatar + // hitbox can only be the combinerhitbox, deletehitbox or construct avatar hitBox.itemDeselect(); if (hitBox instanceof CombinerHitBox) { if (hitBox.item === item) deallocate(item); @@ -291,7 +291,7 @@ class ItemList extends Phaser.Scene { } else if (hitBox instanceof DeleteHitBox) { ws.sendVboxReclaim(vbox.instance, item.index); } else { - ws.sendVboxApply(vbox.instance, hitBox.cryp.id, item.index); + ws.sendVboxApply(vbox.instance, hitBox.construct.id, item.index); deallocate(item); } return true; } diff --git a/phaser-client/src/scenes/menu.cryps.list.js b/phaser-client/src/scenes/menu.cryps.list.js index a6e3c1ea..d5792e71 100644 --- a/phaser-client/src/scenes/menu.cryps.list.js +++ b/phaser-client/src/scenes/menu.cryps.list.js @@ -1,11 +1,11 @@ const Phaser = require('phaser'); -const { TEXT, COLOURS, POSITIONS: { CRYP_LIST } } = require('./constants'); +const { TEXT, COLOURS, POSITIONS: { CONSTRUCT_LIST } } = require('./constants'); const genAvatar = require('./avatar'); const Item = require('./elements/item'); -const BOX_WIDTH = Math.floor(CRYP_LIST.width()); -const BOX_HEIGHT = Math.floor(CRYP_LIST.height() / 3.34); +const BOX_WIDTH = Math.floor(CONSTRUCT_LIST.width()); +const BOX_HEIGHT = Math.floor(CONSTRUCT_LIST.height() / 3.34); const TEXT_MARGIN = 24; @@ -15,113 +15,113 @@ const KEY_MAP = [ 'keydown-THREE', ]; -class MenuCrypList extends Phaser.Scene { +class MenuConstructList extends Phaser.Scene { constructor() { - super({ key: 'MenuCrypList' }); + super({ key: 'MenuConstructList' }); } create() { this.registry.events.on('changedata', this.updateData, this); this.registry.events.on('setdata', this.updateData, this); const player = this.registry.get('player'); - if (player) this.drawCryps(player.cryps); + if (player) this.drawConstructs(player.constructs); } updateData(parent, key, data) { if (key === 'player') { - this.drawCryps(data.cryps); + this.drawConstructs(data.constructs); } } - drawCryps(cryps) { - if (!cryps) return true; - if (this.crypGroup) this.crypGroup.destroy(true); - this.crypGroup = this.add.group(); - const addCryp = (cryp, i) => { - const ROW_X = CRYP_LIST.x(); - const ROW_Y = CRYP_LIST.y() + BOX_HEIGHT * i * 1.1; + drawConstructs(constructs) { + if (!constructs) return true; + if (this.constructGroup) this.constructGroup.destroy(true); + this.constructGroup = this.add.group(); + const addConstruct = (construct, i) => { + const ROW_X = CONSTRUCT_LIST.x(); + const ROW_Y = CONSTRUCT_LIST.y() + BOX_HEIGHT * i * 1.1; const ACTIVE_FILL = 0.2; const FILL = Object.values(COLOURS)[i]; - // Selection of cryps + // Selection of constructs const selectFn = () => { - this.registry.set('crypStats', cryp); + this.registry.set('constructStats', construct); }; - // Cryp interaction box for adding items - const crypInteract = this.add + // Construct interaction box for adding items + const constructInteract = this.add .rectangle(ROW_X, ROW_Y, BOX_WIDTH, BOX_HEIGHT, FILL, ACTIVE_FILL) .setInteractive() .setOrigin(0) .on('pointerdown', selectFn); - crypInteract.itemSelect = () => { - crypInteract.setFillStyle(COLOURS.SELECT); + constructInteract.itemSelect = () => { + constructInteract.setFillStyle(COLOURS.SELECT); }; - crypInteract.itemDeselect = () => { - crypInteract.setFillStyle(FILL, ACTIVE_FILL); + constructInteract.itemDeselect = () => { + constructInteract.setFillStyle(FILL, ACTIVE_FILL); }; - crypInteract.cryp = cryp; + constructInteract.construct = construct; - // Cryp Avatar - const { name } = cryp; - const crypImage = this.add.image( - crypInteract.getCenter().x - crypInteract.width / 4, - crypInteract.getCenter().y, + // Construct Avatar + const { name } = construct; + const constructImage = this.add.image( + constructInteract.getCenter().x - constructInteract.width / 4, + constructInteract.getCenter().y, 'aztec', genAvatar(name) ); // Add text info - const yCrypTextAlgin = Math.floor(crypInteract.y + TEXT_MARGIN / 2); - const xCrypNameAlign = Math.floor(crypInteract.x + crypInteract.width * 1 / 10); - const crypInfoText = this.add.text(xCrypNameAlign, yCrypTextAlgin, name, TEXT.HEADER); + const yConstructTextAlgin = Math.floor(constructInteract.y + TEXT_MARGIN / 2); + const xConstructNameAlign = Math.floor(constructInteract.x + constructInteract.width * 1 / 10); + const constructInfoText = this.add.text(xConstructNameAlign, yConstructTextAlgin, name, TEXT.HEADER); const colourText = (c, j) => { // Placeholder for when gems are implemented - const gemText = this.add.text(crypInteract.x + crypInteract.width * (j + 3) / 6, yCrypTextAlgin, `${c[0]} - ${c[1]}`, TEXT.HEADER); - this.crypGroup.add(gemText); + const gemText = this.add.text(constructInteract.x + constructInteract.width * (j + 3) / 6, yConstructTextAlgin, `${c[0]} - ${c[1]}`, TEXT.HEADER); + this.constructGroup.add(gemText); }; - const { red, green, blue } = cryp.colours; - const CRYP_COLOURS = [ + const { red, green, blue } = construct.colours; + const CONSTRUCT_COLOURS = [ ['R', red], ['G', green], ['B', blue], ]; - CRYP_COLOURS.forEach(colourText); + CONSTRUCT_COLOURS.forEach(colourText); - this.crypGroup.addMultiple([crypInteract, crypImage, crypInfoText]); + this.constructGroup.addMultiple([constructInteract, constructImage, constructInfoText]); - const crypSkill = (stat, j) => { + const constructSkill = (stat, j) => { const SKILL_WIDTH = Math.floor(BOX_WIDTH / 2); const SKILL_HEIGHT = Math.floor(BOX_HEIGHT / 8); - const SKILL_X = crypInteract.getCenter().x + crypInteract.width / 4; - const SKILL_Y = crypInteract.y + SKILL_HEIGHT * 1.15 * (j + 1.6); + const SKILL_X = constructInteract.getCenter().x + constructInteract.width / 4; + const SKILL_Y = constructInteract.y + SKILL_HEIGHT * 1.15 * (j + 1.6); const itemObj = new Item(this, stat.skill, j, SKILL_X, SKILL_Y, SKILL_WIDTH, SKILL_HEIGHT); this.add.existing(itemObj); itemObj.setInteractive(); - const itemInfo = { item: stat.skill, cryp }; + const itemInfo = { item: stat.skill, construct }; itemObj.on('pointerdown', () => this.registry.set('itemInfo', itemInfo)); - this.crypGroup.add(itemObj); + this.constructGroup.add(itemObj); }; - cryp.skills.forEach(crypSkill); + construct.skills.forEach(constructSkill); - const crypSpec = (spec, j) => { + const constructSpec = (spec, j) => { const SKILL_WIDTH = Math.floor(BOX_WIDTH * 0.15); const SKILL_HEIGHT = Math.floor(BOX_HEIGHT * 0.2); - const SKILL_X = Math.floor(crypInteract.x + BOX_WIDTH * (0.6 + j) * 0.175); - const SKILL_Y = Math.floor(crypInteract.y + BOX_HEIGHT * 0.875); + const SKILL_X = Math.floor(constructInteract.x + BOX_WIDTH * (0.6 + j) * 0.175); + const SKILL_Y = Math.floor(constructInteract.y + BOX_HEIGHT * 0.875); const itemObj = new Item(this, spec, j, SKILL_X, SKILL_Y, SKILL_WIDTH, SKILL_HEIGHT); itemObj.setInteractive(); - const itemInfo = { item: spec, cryp }; + const itemInfo = { item: spec, construct }; itemObj.on('pointerdown', () => this.registry.set('itemInfo', itemInfo)); this.add.existing(itemObj); - this.crypGroup.add(itemObj); + this.constructGroup.add(itemObj); }; - cryp.specs.forEach(crypSpec); + construct.specs.forEach(constructSpec); }; - cryps.forEach(addCryp); + constructs.forEach(addConstruct); return true; } @@ -134,4 +134,4 @@ class MenuCrypList extends Phaser.Scene { } } -module.exports = MenuCrypList; +module.exports = MenuConstructList; diff --git a/phaser-client/src/scenes/menu.js b/phaser-client/src/scenes/menu.js index 78e6d749..091335d7 100644 --- a/phaser-client/src/scenes/menu.js +++ b/phaser-client/src/scenes/menu.js @@ -1,7 +1,7 @@ const Phaser = require('phaser'); // Scenes constantly showing -const MenuCrypList = require('./menu.cryps.list'); +const MenuConstructList = require('./menu.constructs.list'); const MenuNavigation = require('./menu.navigation'); const ItemList = require('./item.list'); // Scenes which change depending on menu context @@ -11,7 +11,7 @@ const StatSheet = require('./statsheet'); const ItemInfo = require('./item.info'); const FIXED_MENU_SCENES = [ - 'MenuCrypList', + 'MenuConstructList', 'MenuNavigation', 'ItemList', ]; @@ -37,7 +37,7 @@ class Menu extends Phaser.Scene { this.registry.get('ws').sendPlayerState(player.instance); // When we load the menu request the latest items // Item list will restart when the data comes in - this.scene.manager.add('MenuCrypList', MenuCrypList, true); + this.scene.manager.add('MenuConstructList', MenuConstructList, true); this.scene.manager.add('MenuNavigation', MenuNavigation, true); this.scene.manager.add('ItemList', ItemList, true); this.registry.set('inMenu', true); @@ -53,7 +53,7 @@ class Menu extends Phaser.Scene { case 'home': return this.cleanUp(); case 'zone': return this.newMainScene('Zones', Zones, data); case 'gameList': return this.newMainScene('GameList', GameList, data); - case 'crypStats': return this.newMainScene('StatSheet', StatSheet, data); + case 'constructStats': return this.newMainScene('StatSheet', StatSheet, data); case 'itemInfo': return this.newMainScene('ItemInfo', ItemInfo, data); default: return false; } diff --git a/phaser-client/src/scenes/statsheet.js b/phaser-client/src/scenes/statsheet.js index e7116f56..802a21d3 100644 --- a/phaser-client/src/scenes/statsheet.js +++ b/phaser-client/src/scenes/statsheet.js @@ -21,8 +21,8 @@ class DeleteHitBox extends Phaser.GameObjects.Rectangle { } const itemCheckHitbox = (scene, pointer) => { - const { list } = scene.scene.get('MenuCrypList').children; - const hitboxes = list.filter(c => c.cryp) + const { list } = scene.scene.get('MenuConstructList').children; + const hitboxes = list.filter(c => c.construct) .concat(scene.children.list.filter(c => c instanceof DeleteHitBox)); let found; @@ -47,12 +47,12 @@ class StatSheet extends Phaser.Scene { if (key === 'player') { console.log('grep'); console.log(data); - const cryp = data.cryps.find(c => c.id === this.cryp.id); - this.scene.restart(cryp); + const construct = data.constructs.find(c => c.id === this.construct.id); + this.scene.restart(construct); } } - create(cryp) { + create(construct) { this.registry.events.on('changedata', this.updateData, this); // const ws = this.registry.get('ws'); @@ -60,7 +60,7 @@ class StatSheet extends Phaser.Scene { if (!player) return false; // const { vbox } = player; - this.cryp = cryp; + this.construct = construct; /* const del = this.add.existing(new DeleteHitBox(this, X + WIDTH * 0.7, Y + HEIGHT * 0.6)); @@ -68,25 +68,25 @@ class StatSheet extends Phaser.Scene { .setOrigin(0.5, 0.5); */ - this.add.text(X, Y, cryp.name, TEXT.HEADER); + this.add.text(X, Y, construct.name, TEXT.HEADER); - const crypStat = (stat, i) => { + const constructStat = (stat, i) => { const STAT_X = X; const STAT_Y = Y + (i + 2) * TEXT_MARGIN; this.add.text(STAT_X, STAT_Y, `${stat.stat}: ${stat.base} -> ${stat.value}`, TEXT.NORMAL); }; - const CRYP_STATS = [ - cryp.hp, - cryp.red_shield, - cryp.blue_shield, - cryp.evasion, - cryp.red_damage, - cryp.blue_damage, - cryp.speed, + const CONSTRUCT_STATS = [ + construct.hp, + construct.red_shield, + construct.blue_shield, + construct.evasion, + construct.red_damage, + construct.blue_damage, + construct.speed, ]; - CRYP_STATS.forEach(crypStat); + CONSTRUCT_STATS.forEach(constructStat); /* const knownSkill = (skill, i) => { const SKILL_X = X + WIDTH * 0.4 + WIDTH * 0.125 * i; @@ -96,7 +96,7 @@ class StatSheet extends Phaser.Scene { this.input.setDraggable(itemObj); this.add.existing(itemObj); }; - cryp.skills.forEach(knownSkill); + construct.skills.forEach(knownSkill); this.add.text(X + WIDTH * 0.35, Y, 'Skills', TEXT.HEADER); this.add.text(X + WIDTH * 0.35, Y + HEIGHT * 0.25, 'Specs', TEXT.HEADER); @@ -108,7 +108,7 @@ class StatSheet extends Phaser.Scene { this.input.setDraggable(itemObj); this.add.existing(itemObj); }; - cryp.specs.forEach(knownSpec); + construct.specs.forEach(knownSpec); this.input.on('drag', (pointer, item, dragX, dragY) => { @@ -126,7 +126,7 @@ class StatSheet extends Phaser.Scene { if (hitBox) { hitBox.itemDeselect(); // add socket function for unlearn here - ws.sendVboxUnequip(vbox.instance, cryp.id, item.item); + ws.sendVboxUnequip(vbox.instance, construct.id, item.item); } return true; }); diff --git a/phaser-client/src/scenes/zones.js b/phaser-client/src/scenes/zones.js index 13596dfc..fcedab65 100644 --- a/phaser-client/src/scenes/zones.js +++ b/phaser-client/src/scenes/zones.js @@ -70,7 +70,7 @@ class Zones extends Phaser.Scene { // Check cursor hasn't significantly moved during point allocation // If panning and mouse release is on node it won't allocate if (gameObjects[0] instanceof Node) { - const team = this.registry.get('cryps').filter(c => c.active).map(c => c.id); + const team = this.registry.get('constructs').filter(c => c.active).map(c => c.id); if (gameObjects[0].success) return false; this.registry.get('ws').sendZoneJoin(zoneId, gameObjects[0].id, team); } diff --git a/phaser-client/src/socket.js b/phaser-client/src/socket.js index df705042..26c58848 100644 --- a/phaser-client/src/socket.js +++ b/phaser-client/src/socket.js @@ -2,7 +2,7 @@ const toast = require('izitoast'); const cbor = require('borc'); -const SOCKET_URL = process.env.NODE_ENV === 'production' ? 'wss://cryps.gg/ws' : 'ws://localhost:40000'; +const SOCKET_URL = process.env.NODE_ENV === 'production' ? 'wss://constructs.gg/ws' : 'ws://localhost:40000'; function errorToast(err) { console.error(err); @@ -41,8 +41,8 @@ function createSocket(events) { send({ method: 'account_demo', params: {} }); } - function sendAccountCryps() { - send({ method: 'account_cryps', params: {} }); + function sendAccountConstructs() { + send({ method: 'account_constructs', params: {} }); } function sendAccountInstances() { @@ -53,40 +53,40 @@ function createSocket(events) { send({ method: 'account_zone', params: {} }); } - function sendCrypSpawn(name) { - send({ method: 'cryp_spawn', params: { name } }); + function sendConstructSpawn(name) { + send({ method: 'construct_spawn', params: { name } }); } - function sendCrypLearn(id, skill) { - send({ method: 'cryp_learn', params: { id, skill } }); + function sendConstructLearn(id, skill) { + send({ method: 'construct_learn', params: { id, skill } }); } - function sendCrypForget(id, skill) { - send({ method: 'cryp_forget', params: { id, skill } }); + function sendConstructForget(id, skill) { + send({ method: 'construct_forget', params: { id, skill } }); } function sendGameState(id) { send({ method: 'game_state', params: { id } }); } - function sendGamePve(crypIds, mode) { - send({ method: 'game_pve', params: { cryp_ids: crypIds, mode } }); + function sendGamePve(constructIds, mode) { + send({ method: 'game_pve', params: { construct_ids: constructIds, mode } }); } - function sendGamePvp(crypIds) { - send({ method: 'game_pvp', params: { cryp_ids: crypIds } }); + function sendGamePvp(constructIds) { + send({ method: 'game_pvp', params: { construct_ids: constructIds } }); } - function sendGameJoin(gameId, crypIds) { - send({ method: 'game_join', params: { game_id: gameId, cryp_ids: crypIds } }); + function sendGameJoin(gameId, constructIds) { + send({ method: 'game_join', params: { game_id: gameId, construct_ids: constructIds } }); } function sendSpecForget(id, spec) { - send({ method: 'cryp_unspec', params: { id, spec } }); + send({ method: 'construct_unspec', params: { id, spec } }); } - function sendPlayerCrypsSet(instanceId, crypIds) { - send({ method: 'player_cryps_set', params: { instance_id: instanceId, cryp_ids: crypIds } }); + function sendPlayerConstructsSet(instanceId, constructIds) { + send({ method: 'player_constructs_set', params: { instance_id: instanceId, construct_ids: constructIds } }); } function sendPlayerState(instanceId) { @@ -97,12 +97,12 @@ function createSocket(events) { send({ method: 'player_vbox_accept', params: { instance_id: instanceId, group, index } }); } - function sendVboxApply(instanceId, crypId, index) { - send({ method: 'player_vbox_apply', params: { instance_id: instanceId, cryp_id: crypId, index } }); + function sendVboxApply(instanceId, constructId, index) { + send({ method: 'player_vbox_apply', params: { instance_id: instanceId, construct_id: constructId, index } }); } - function sendVboxUnequip(instanceId, crypId, target) { - send({ method: 'player_vbox_unequip', params: { instance_id: instanceId, cryp_id: crypId, target } }); + function sendVboxUnequip(instanceId, constructId, target) { + send({ method: 'player_vbox_unequip', params: { instance_id: instanceId, construct_id: constructId, target } }); } function sendVboxDiscard(instanceId) { @@ -117,18 +117,18 @@ function createSocket(events) { send({ method: 'player_vbox_reclaim', params: { instance_id: instanceId, index } }); } - function sendGameSkill(gameId, crypId, targetCrypId, skill) { + function sendGameSkill(gameId, constructId, targetConstructId, skill) { send({ method: 'game_skill', params: { - game_id: gameId, cryp_id: crypId, target_cryp_id: targetCrypId, skill, + game_id: gameId, construct_id: constructId, target_construct_id: targetConstructId, skill, }, }); events.setActiveSkill(null); } - function sendGameTarget(gameId, crypId, skillId) { - send({ method: 'game_target', params: { game_id: gameId, cryp_id: crypId, skill_id: skillId } }); + function sendGameTarget(gameId, constructId, skillId) { + send({ method: 'game_target', params: { game_id: gameId, construct_id: constructId, skill_id: skillId } }); events.setActiveSkill(null); } @@ -136,16 +136,16 @@ function createSocket(events) { send({ method: 'zone_create', params: {} }); } - function sendZoneJoin(zoneId, nodeId, crypIds) { - send({ method: 'zone_join', params: { zone_id: zoneId, node_id: nodeId, cryp_ids: crypIds } }); + function sendZoneJoin(zoneId, nodeId, constructIds) { + send({ method: 'zone_join', params: { zone_id: zoneId, node_id: nodeId, construct_ids: constructIds } }); } function sendZoneClose(zoneId) { send({ method: 'zone_close', params: { zone_id: zoneId } }); } - function sendInstanceJoin(cryps) { - send({ method: 'instance_join', params: { cryp_ids: cryps, pve: true } }); + function sendInstanceJoin(constructs) { + send({ method: 'instance_join', params: { construct_ids: constructs, pve: true } }); } function sendInstanceReady(instanceId) { @@ -165,7 +165,7 @@ function createSocket(events) { account = login; events.setAccount(login); - sendAccountCryps(); + sendAccountConstructs(); } function accountInstanceList(res) { @@ -173,9 +173,9 @@ function createSocket(events) { events.setInstanceList(instanceList); } - function accountCryps(response) { - const [structName, cryps] = response; - events.setCrypList(cryps); + function accountConstructs(response) { + const [structName, constructs] = response; + events.setConstructList(constructs); } function gameState(response) { @@ -183,8 +183,8 @@ function createSocket(events) { events.setGame(game); } - function crypSpawn(response) { - const [structName, cryp] = response; + function constructSpawn(response) { + const [structName, construct] = response; } function gamePve(response) { @@ -213,14 +213,14 @@ function createSocket(events) { // when the server sends a reply it will have one of these message types // this object wraps the reply types to a function const handlers = { - cryp_spawn: crypSpawn, - cryp_forget: () => true, - cryp_learn: () => true, + construct_spawn: constructSpawn, + construct_forget: () => true, + construct_learn: () => true, game_pve: gamePve, game_state: gameState, account_login: accountLogin, account_create: accountLogin, - account_cryps: accountCryps, + account_constructs: accountConstructs, account_instances: accountInstanceList, instance_scores: instanceScores, zone_create: res => console.log(res), @@ -232,9 +232,9 @@ function createSocket(events) { function errHandler(error) { switch (error) { case 'no active zone': return sendZoneCreate(); - case 'no cryps selected': return events.errorPrompt('select_cryps'); + case 'no constructs selected': return events.errorPrompt('select_constructs'); case 'node requirements not met': return events.errorPrompt('complete_nodes'); - case 'cryp at max skills (4)': return events.errorPrompt('max_skills'); + case 'construct at max skills (4)': return events.errorPrompt('max_skills'); default: return errorToast(error); @@ -301,7 +301,7 @@ function createSocket(events) { sendAccountLogin, sendAccountCreate, sendAccountDemo, - sendAccountCryps, + sendAccountConstructs, sendAccountInstances, sendAccountZone, sendGameState, @@ -310,9 +310,9 @@ function createSocket(events) { sendGameJoin, sendGameSkill, sendGameTarget, - sendCrypSpawn, - sendCrypLearn, - sendCrypForget, + sendConstructSpawn, + sendConstructLearn, + sendConstructForget, sendSpecForget, sendZoneCreate, sendZoneJoin, @@ -320,7 +320,7 @@ function createSocket(events) { sendInstanceJoin, sendInstanceReady, sendInstanceScores, - sendPlayerCrypsSet, + sendPlayerConstructsSet, sendPlayerState, sendVboxAccept, sendVboxApply, diff --git a/phaser-client/src/tutorial.js b/phaser-client/src/tutorial.js index a73ff00d..186927c7 100644 --- a/phaser-client/src/tutorial.js +++ b/phaser-client/src/tutorial.js @@ -9,34 +9,34 @@ function noMore(instance, thisToast) { } const WELCOME_MESSAGE = ` -Welcome to cryps.gg +Welcome to constructs.gg Enter a username and password and press register to sign up, or just press DEMO to quick start. `; const HOMEPAGE_MESSAGE = ` -This homepage shows your cryps, joinable online games, PVE options and your items.\n -If you have no cryps yet, press SPAWN and give your cryp a name to create one. -Once you have made a cryp, click on them to visit their stat page and teach them some SKILLS. +This homepage shows your constructs, joinable online games, PVE options and your items.\n +If you have no constructs yet, press SPAWN and give your construct a name to create one. +Once you have made a construct, click on them to visit their stat page and teach them some SKILLS. The stat page also has descriptions of each skill and their effects. -cryps have 3 basic stats: hp, red damage and magic damage. -Toggle whether a cryp is selected for your team by clicking the coloured stripes next to the cryp or press 1,2,3. +constructs have 3 basic stats: hp, red damage and magic damage. +Toggle whether a construct is selected for your team by clicking the coloured stripes next to the construct or press 1,2,3. Once you have a team ready press the New PVE Game button to start playing. `; const SKILL_PHASE_MESSAGE = ` -A cryps battle has two main phases. This first phase is called the SKILL PHASE. -Your cryps are positioned on the left, your opponent's are on the right. -In the centre are your cryps' SKILLS, grayed out SKILLS are currently ON COOLDOWN. -A skill's cooldown reduces on every turn that cryp does not use a skill with a cooldown. -For the moment, drag ATTACK onto the opponent team to have your cryps attack them with red damage. +A constructs battle has two main phases. This first phase is called the SKILL PHASE. +Your constructs are positioned on the left, your opponent's are on the right. +In the centre are your constructs' SKILLS, grayed out SKILLS are currently ON COOLDOWN. +A skill's cooldown reduces on every turn that construct does not use a skill with a cooldown. +For the moment, drag ATTACK onto the opponent team to have your constructs attack them with red damage. `; // const TARGET_PHASE_MESSAGE = ` // This phase is the TARGET PHASE. -// In cryps you do not directly attack your opponent's cryps, you attack the opponent as a team -// and you and your opponent choose which cryp is the TARGET of each ability. -// Drag the incoming ATTACKS from the right hand side onto your own cryps. +// In constructs you do not directly attack your opponent's constructs, you attack the opponent as a team +// and you and your opponent choose which construct is the TARGET of each ability. +// Drag the incoming ATTACKS from the right hand side onto your own constructs. // It's wise to spread the damage around! // `; @@ -44,9 +44,9 @@ const RESOLUTION_PHASE_MESSAGE = ` The second phase is called the RESOLUTION PHASE. This phase happens automatically, every skill is RESOLVED in order of its SPEED. This is important because attacks only RESOLVE while their caster is still able to use the skill, -a fast skill that does a small amount of damage may KO an opponent cryp, causing any SKILLS +a fast skill that does a small amount of damage may KO an opponent construct, causing any SKILLS they have used to no longer RESOLVE! -Another example of this is the skill STUN. STUN causes an opponent cryp to be unable to use any +Another example of this is the skill STUN. STUN causes an opponent construct to be unable to use any abilities for TWO TURNS including the turn it resolves on. In other words it lasts for the rest of the turn it resolves on and the whole next turn. Try it now! @@ -54,10 +54,10 @@ Try it now! const FINISH_PHASE_MESSAGE = ` gg! The game has now concluded, if you were the winner you have been awarded with a STAT REROLL ITEM. -You can use this to reroll a stat on a cryp which may be lacking. +You can use this to reroll a stat on a construct which may be lacking. A good metric is that if a stat is more than 1/2 of its STAMINA that's a good roll. Now that you have learned the basics, press BACKSPACE to return to the main menu -and experiment with some combinations of SKILLS or replace the ones your cryps know in the STAT PAGE. +and experiment with some combinations of SKILLS or replace the ones your constructs know in the STAT PAGE. glhf! `; diff --git a/server/.env b/server/.env index f42f5c28..8866a855 100644 --- a/server/.env +++ b/server/.env @@ -1 +1 @@ -DATABASE_URL=postgres://cryps:craftbeer@localhost/cryps +DATABASE_URL=postgres://constructs:craftbeer@localhost/constructs diff --git a/server/Cargo.toml b/server/Cargo.toml index a0ed55f2..4732d280 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "cryps" +name = "constructs" version = "0.1.0" authors = ["ntr "] @@ -13,7 +13,7 @@ serde_cbor = "0.9" chrono = { version = "0.4", features = ["serde"] } tungstenite = "0.6" -bcrypt = "0.2" +bconstructt = "0.2" dotenv = "0.9.0" postgres = { version = "0.15", features = ["with-uuid"] } diff --git a/server/src/account.rs b/server/src/account.rs index d2cadc7f..31ca4d8f 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -1,5 +1,5 @@ use uuid::Uuid; -use bcrypt::{hash, verify}; +use bconstructt::{hash, verify}; use rand::{thread_rng, Rng}; use rand::distributions::Alphanumeric; use std::iter; @@ -9,7 +9,7 @@ use postgres::transaction::Transaction; use rpc::{AccountCreateParams, AccountLoginParams}; -use cryp::{Cryp, cryp_recover}; +use construct::{Construct, construct_recover}; use instance::{Instance, instance_delete}; use failure::Error; @@ -155,34 +155,34 @@ pub fn account_login(params: AccountLoginParams, tx: &mut Transaction) -> Result return Ok(account); } -pub fn account_cryps(tx: &mut Transaction, account: &Account) -> Result, Error> { +pub fn account_constructs(tx: &mut Transaction, account: &Account) -> Result, Error> { let query = " SELECT data - FROM cryps + FROM constructs WHERE account = $1; "; let result = tx .query(query, &[&account.id])?; - let cryps: Result, _> = result.iter() + let constructs: Result, _> = result.iter() .map(|row| { - let cryp_bytes: Vec = row.get(0); - match from_slice::(&cryp_bytes) { + let construct_bytes: Vec = row.get(0); + match from_slice::(&construct_bytes) { Ok(c) => Ok(c), - Err(_e) => cryp_recover(cryp_bytes, tx), + Err(_e) => construct_recover(construct_bytes, tx), } }) .collect(); // catch any errors - if cryps.is_err() { - return Err(err_msg("could not deserialize a cryp")); + if constructs.is_err() { + return Err(err_msg("could not deserialize a construct")); } - let mut cryps = cryps.unwrap(); - cryps.sort_by_key(|c| c.id); - return Ok(cryps); + let mut constructs = constructs.unwrap(); + constructs.sort_by_key(|c| c.id); + return Ok(constructs); } pub fn account_instances(tx: &mut Transaction, account: &Account) -> Result, Error> { diff --git a/server/src/cryp.rs b/server/src/cryp.rs index b7efba0e..9c29721d 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -8,7 +8,7 @@ use failure::Error; use failure::err_msg; use account::{Account}; -use rpc::{CrypSpawnParams}; +use rpc::{ConstructSpawnParams}; use skill::{Skill, Cooldown, Effect, Cast, Colour, Immunity, Disable, Event}; use spec::{Spec}; use item::{Item}; @@ -25,15 +25,15 @@ impl Colours { Colours { red: 0, green: 0, blue: 0 } } - pub fn from_cryp(cryp: &Cryp) -> Colours { + pub fn from_construct(construct: &Construct) -> Colours { let mut count = Colours::new(); - for spec in cryp.specs.iter() { + for spec in construct.specs.iter() { let v = Item::from(*spec); v.colours(&mut count); } - for cs in cryp.skills.iter() { + for cs in construct.skills.iter() { let v = Item::from(cs.skill); v.colours(&mut count); } @@ -44,15 +44,15 @@ impl Colours { #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] -pub struct CrypSkill { +pub struct ConstructSkill { pub skill: Skill, pub self_targeting: bool, pub cd: Cooldown, } -impl CrypSkill { - pub fn new(skill: Skill) -> CrypSkill { - CrypSkill { +impl ConstructSkill { + pub fn new(skill: Skill) -> ConstructSkill { + ConstructSkill { skill, self_targeting: skill.self_targeting(), cd: skill.base_cd(), @@ -69,24 +69,24 @@ pub enum EffectMeta { } #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] -pub struct CrypEffect { +pub struct ConstructEffect { pub effect: Effect, pub duration: u8, pub meta: Option, pub tick: Option, } -impl CrypEffect { - pub fn new(effect: Effect, duration: u8) -> CrypEffect { - CrypEffect { effect, duration, meta: None, tick: None } +impl ConstructEffect { + pub fn new(effect: Effect, duration: u8) -> ConstructEffect { + ConstructEffect { effect, duration, meta: None, tick: None } } - pub fn set_tick(mut self, tick: Cast) -> CrypEffect { + pub fn set_tick(mut self, tick: Cast) -> ConstructEffect { self.tick = Some(tick); self } - pub fn set_meta(mut self, meta: EffectMeta) -> CrypEffect { + pub fn set_meta(mut self, meta: EffectMeta) -> ConstructEffect { self.meta = Some(meta); self } @@ -119,20 +119,20 @@ pub enum Stat { } #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] -pub struct CrypStat { +pub struct ConstructStat { base: u64, value: u64, max: u64, pub stat: Stat, } -impl CrypStat { - // pub fn set(&mut self, v: u64, specs: &Vec) -> &mut CrypStat { +impl ConstructStat { + // pub fn set(&mut self, v: u64, specs: &Vec) -> &mut ConstructStat { // self.base = v; // self.recalculate(specs) // } - pub fn recalculate(&mut self, specs: &Vec, cryp_colours: &Colours, player_colours: &Colours) -> &mut CrypStat { + pub fn recalculate(&mut self, specs: &Vec, construct_colours: &Colours, player_colours: &Colours) -> &mut ConstructStat { let specs = specs .iter() .filter(|s| s.affects().contains(&self.stat)) @@ -141,19 +141,19 @@ impl CrypStat { // applied with fold because it can be zeroed or multiplied // but still needs access to the base amount - let value = specs.iter().fold(self.base, |acc, s| s.apply(acc, self.base, cryp_colours, player_colours)); + let value = specs.iter().fold(self.base, |acc, s| s.apply(acc, self.base, construct_colours, player_colours)); self.value = value; self.max = value; self } - pub fn reduce(&mut self, amt: u64) -> &mut CrypStat { + pub fn reduce(&mut self, amt: u64) -> &mut ConstructStat { self.value = self.value.saturating_sub(amt); self } - pub fn increase(&mut self, amt: u64) -> &mut CrypStat { + pub fn increase(&mut self, amt: u64) -> &mut ConstructStat { self.value = *[ self.value.saturating_add(amt), self.max @@ -162,7 +162,7 @@ impl CrypStat { self } - pub fn force(&mut self, v: u64) -> &mut CrypStat { + pub fn force(&mut self, v: u64) -> &mut ConstructStat { self.base = v; self.value = v; self.max = v; @@ -172,45 +172,45 @@ impl CrypStat { } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct CrypRecover { +pub struct ConstructRecover { pub id: Uuid, pub account: Uuid, pub name: String, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct Cryp { +pub struct Construct { pub id: Uuid, pub account: Uuid, - pub red_damage: CrypStat, - pub red_life: CrypStat, - pub blue_life: CrypStat, - pub blue_damage: CrypStat, - pub green_damage: CrypStat, - pub speed: CrypStat, - pub green_life: CrypStat, - pub evasion: CrypStat, - pub skills: Vec, - pub effects: Vec, + pub red_damage: ConstructStat, + pub red_life: ConstructStat, + pub blue_life: ConstructStat, + pub blue_damage: ConstructStat, + pub green_damage: ConstructStat, + pub speed: ConstructStat, + pub green_life: ConstructStat, + pub evasion: ConstructStat, + pub skills: Vec, + pub effects: Vec, pub specs: Vec, pub colours: Colours, pub name: String, } -impl Cryp { - pub fn new() -> Cryp { +impl Construct { + pub fn new() -> Construct { let id = Uuid::new_v4(); - return Cryp { + return Construct { id, account: id, - red_damage: CrypStat { base: 256, value: 256, max: 256, stat: Stat::RedDamage }, - red_life: CrypStat { base: 0, value: 0, max: 0, stat: Stat::RedLife }, - blue_damage: CrypStat { base: 256, value: 256, max: 256, stat: Stat::BlueDamage }, - blue_life: CrypStat { base: 0, value: 0, max: 0, stat: Stat::BlueLife }, - green_damage: CrypStat { base: 256, value: 256, max: 256, stat: Stat::GreenDamage }, - green_life: CrypStat { base: 1024, value: 1024, max: 1024, stat: Stat::GreenLife }, - speed: CrypStat { base: 128, value: 128, max: 128, stat: Stat::Speed }, - evasion: CrypStat { base: 0, value: 0, max: 0, stat: Stat::Evasion }, + red_damage: ConstructStat { base: 256, value: 256, max: 256, stat: Stat::RedDamage }, + red_life: ConstructStat { base: 0, value: 0, max: 0, stat: Stat::RedLife }, + blue_damage: ConstructStat { base: 256, value: 256, max: 256, stat: Stat::BlueDamage }, + blue_life: ConstructStat { base: 0, value: 0, max: 0, stat: Stat::BlueLife }, + green_damage: ConstructStat { base: 256, value: 256, max: 256, stat: Stat::GreenDamage }, + green_life: ConstructStat { base: 1024, value: 1024, max: 1024, stat: Stat::GreenLife }, + speed: ConstructStat { base: 128, value: 128, max: 128, stat: Stat::Speed }, + evasion: ConstructStat { base: 0, value: 0, max: 0, stat: Stat::Evasion }, skills: vec![], effects: vec![], specs: vec![], @@ -219,28 +219,28 @@ impl Cryp { }; } - pub fn named(mut self, name: &String) -> Cryp { + pub fn named(mut self, name: &String) -> Construct { self.name = name.clone(); self } - pub fn set_account(mut self, account: Uuid) -> Cryp { + pub fn set_account(mut self, account: Uuid) -> Construct { self.account = account; self } - pub fn learn(mut self, s: Skill) -> Cryp { - self.skills.push(CrypSkill::new(s)); - self.colours = Colours::from_cryp(&self); + pub fn learn(mut self, s: Skill) -> Construct { + self.skills.push(ConstructSkill::new(s)); + self.colours = Colours::from_construct(&self); self } - pub fn learn_mut(&mut self, s: Skill) -> &mut Cryp { - self.skills.push(CrypSkill::new(s)); + pub fn learn_mut(&mut self, s: Skill) -> &mut Construct { + self.skills.push(ConstructSkill::new(s)); self.calculate_colours() } - pub fn forget(&mut self, skill: Skill) -> Result<&mut Cryp, Error> { + pub fn forget(&mut self, skill: Skill) -> Result<&mut Construct, Error> { match self.skills.iter().position(|s| s.skill == skill) { Some(i) => { self.skills.remove(i); @@ -250,7 +250,7 @@ impl Cryp { } } - pub fn spec_add(&mut self, spec: Spec) -> Result<&mut Cryp, Error> { + pub fn spec_add(&mut self, spec: Spec) -> Result<&mut Construct, Error> { if self.specs.len() >= 6 { return Err(err_msg("maximum specs equipped")); } @@ -259,7 +259,7 @@ impl Cryp { return Ok(self.calculate_colours()); } - pub fn spec_remove(&mut self, spec: Spec) -> Result<&mut Cryp, Error> { + pub fn spec_remove(&mut self, spec: Spec) -> Result<&mut Construct, Error> { match self.specs.iter().position(|s| *s == spec) { Some(p) => self.specs.remove(p), None => return Err(err_msg("spec not found")), @@ -268,12 +268,12 @@ impl Cryp { Ok(self.calculate_colours()) } - fn calculate_colours(&mut self) -> &mut Cryp { - self.colours = Colours::from_cryp(&self); + fn calculate_colours(&mut self) -> &mut Construct { + self.colours = Colours::from_construct(&self); self } - pub fn apply_modifiers(&mut self, player_colours: &Colours) -> &mut Cryp { + pub fn apply_modifiers(&mut self, player_colours: &Colours) -> &mut Construct { self.specs.sort_unstable(); self.red_damage.recalculate(&self.specs, &self.colours, player_colours); @@ -292,7 +292,7 @@ impl Cryp { self.green_life.value == 0 } - pub fn force_ko(&mut self) -> &mut Cryp { + pub fn force_ko(&mut self) -> &mut Construct { self.green_life.value = 0; self } @@ -340,7 +340,7 @@ impl Cryp { self.effects.iter().any(|s| s.effect == effect) } - pub fn available_skills(&self) -> Vec<&CrypSkill> { + pub fn available_skills(&self) -> Vec<&ConstructSkill> { self.skills.iter() .filter(|s| s.cd.is_none()) .filter(|s| self.disabled(s.skill).is_none()) @@ -377,19 +377,19 @@ impl Cryp { self.skills.iter().any(|s| s.skill == skill) } - pub fn skill_on_cd(&self, skill: Skill) -> Option<&CrypSkill> { + pub fn skill_on_cd(&self, skill: Skill) -> Option<&ConstructSkill> { self.skills.iter().find(|s| s.skill == skill && s.cd.is_some()) } - pub fn skill_set_cd(&mut self, skill: Skill) -> &mut Cryp { + pub fn skill_set_cd(&mut self, skill: Skill) -> &mut Construct { let i = self.skills.iter().position(|s| s.skill == skill).unwrap(); self.skills.remove(i); - self.skills.push(CrypSkill::new(skill)); + self.skills.push(ConstructSkill::new(skill)); self } - pub fn reduce_cooldowns(&mut self) -> &mut Cryp { + pub fn reduce_cooldowns(&mut self) -> &mut Construct { for skill in self.skills.iter_mut() { // if used cooldown if skill.skill.base_cd().is_some() { @@ -412,7 +412,7 @@ impl Cryp { self } - pub fn reduce_effect_durations(&mut self) -> &mut Cryp { + pub fn reduce_effect_durations(&mut self) -> &mut Construct { self.effects = self.effects.clone().into_iter().filter_map(|mut effect| { effect.duration = effect.duration.saturating_sub(1); @@ -422,7 +422,7 @@ impl Cryp { // info!("reduced effect {:?}", effect); return Some(effect); - }).collect::>(); + }).collect::>(); self } @@ -734,7 +734,7 @@ impl Cryp { return events; } - pub fn add_effect(&mut self, skill: Skill, effect: CrypEffect) -> Event { + pub fn add_effect(&mut self, skill: Skill, effect: ConstructEffect) -> Event { if let Some(immunity) = self.immune(skill) { return Event::Immunity { skill, @@ -776,10 +776,10 @@ impl Cryp { } } -pub fn cryp_get(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Result { +pub fn construct_get(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Result { let query = " SELECT data - FROM cryps + FROM constructs WHERE id = $1 AND account = $2; "; @@ -787,110 +787,110 @@ pub fn cryp_get(tx: &mut Transaction, id: Uuid, account_id: Uuid) -> Result = result.get(0); - let cryp = from_slice::(&cryp_bytes).or_else(|_| cryp_recover(cryp_bytes, tx))?; + let result = result.iter().next().ok_or(format_err!("construct {:} not found", id))?; + let construct_bytes: Vec = result.get(0); + let construct = from_slice::(&construct_bytes).or_else(|_| construct_recover(construct_bytes, tx))?; - return Ok(cryp); + return Ok(construct); } -pub fn cryp_spawn(params: CrypSpawnParams, tx: &mut Transaction, account: &Account) -> Result { - let cryp = Cryp::new() +pub fn construct_spawn(params: ConstructSpawnParams, tx: &mut Transaction, account: &Account) -> Result { + let construct = Construct::new() .named(¶ms.name) .set_account(account.id); - let cryp_bytes = to_vec(&cryp)?; + let construct_bytes = to_vec(&construct)?; let query = " - INSERT INTO cryps (id, account, data) + INSERT INTO constructs (id, account, data) VALUES ($1, $2, $3) RETURNING id, account; "; let result = tx - .query(query, &[&cryp.id, &account.id, &cryp_bytes])?; + .query(query, &[&construct.id, &account.id, &construct_bytes])?; let _returned = result.iter().next().ok_or(err_msg("no row returned"))?; - // info!("{:?} spawned cryp {:}", account.id, cryp.id); + // info!("{:?} spawned construct {:}", account.id, construct.id); - return Ok(cryp); + return Ok(construct); } -pub fn cryp_write(cryp: Cryp, tx: &mut Transaction) -> Result { - let cryp_bytes = to_vec(&cryp)?; +pub fn construct_write(construct: Construct, tx: &mut Transaction) -> Result { + let construct_bytes = to_vec(&construct)?; let query = " - UPDATE cryps + UPDATE constructs SET data = $1, updated_at = now() WHERE id = $2 RETURNING id, account, data; "; let result = tx - .query(query, &[&cryp_bytes, &cryp.id])?; + .query(query, &[&construct_bytes, &construct.id])?; let _returned = result.iter().next().expect("no row returned"); - // info!("{:?} wrote cryp", cryp.id); + // info!("{:?} wrote construct", construct.id); - return Ok(cryp); + return Ok(construct); } -pub fn cryp_recover(cryp_bytes: Vec, tx: &mut Transaction) -> Result { - let c = from_slice::(&cryp_bytes)?; +pub fn construct_recover(construct_bytes: Vec, tx: &mut Transaction) -> Result { + let c = from_slice::(&construct_bytes)?; - let mut cryp = Cryp::new() + let mut construct = Construct::new() .named(&c.name) .set_account(c.account); - cryp.id = c.id; + construct.id = c.id; - info!("recovered cryp {:?}", c.name); + info!("recovered construct {:?}", c.name); - return cryp_write(cryp, tx); + return construct_write(construct, tx); } #[cfg(test)] mod tests { - use cryp::*; + use construct::*; use util::IntPct; #[test] - fn create_cryp_test() { - let cryp = Cryp::new() + fn create_construct_test() { + let construct = Construct::new() .named(&"hatchling".to_string()); - assert_eq!(cryp.name, "hatchling".to_string()); + assert_eq!(construct.name, "hatchling".to_string()); return; } #[test] - fn cryp_colours_test() { - let mut cryp = Cryp::new() + fn construct_colours_test() { + let mut construct = Construct::new() .named(&"redboi".to_string()); - cryp.learn_mut(Skill::Strike); - cryp.spec_add(Spec::GreenLifeI).unwrap(); - cryp.spec_add(Spec::RedDamageI).unwrap(); - cryp.spec_add(Spec::RedDamageI).unwrap(); - cryp.spec_add(Spec::BlueLifeI).unwrap(); + construct.learn_mut(Skill::Strike); + construct.spec_add(Spec::GreenLifeI).unwrap(); + construct.spec_add(Spec::RedDamageI).unwrap(); + construct.spec_add(Spec::RedDamageI).unwrap(); + construct.spec_add(Spec::BlueLifeI).unwrap(); - assert_eq!(cryp.colours.red, 6); - assert_eq!(cryp.colours.green, 2); - assert_eq!(cryp.colours.blue, 2); + assert_eq!(construct.colours.red, 6); + assert_eq!(construct.colours.green, 2); + assert_eq!(construct.colours.blue, 2); return; } #[test] - fn cryp_player_modifiers_test() { - let mut cryp = Cryp::new() + fn construct_player_modifiers_test() { + let mut construct = Construct::new() .named(&"player player".to_string()); - cryp.spec_add(Spec::RedDamageI).unwrap(); - cryp.spec_add(Spec::GreenDamageI).unwrap(); - cryp.spec_add(Spec::BlueDamageI).unwrap(); + construct.spec_add(Spec::RedDamageI).unwrap(); + construct.spec_add(Spec::GreenDamageI).unwrap(); + construct.spec_add(Spec::BlueDamageI).unwrap(); let player_colours = Colours { red: 5, @@ -898,11 +898,11 @@ mod tests { blue: 25, }; - cryp.apply_modifiers(&player_colours); + construct.apply_modifiers(&player_colours); - assert!(cryp.red_damage.value == cryp.red_damage.base + cryp.red_damage.base.pct(20)); - assert!(cryp.green_damage.value == cryp.green_damage.base + cryp.green_damage.base.pct(40)); - assert!(cryp.blue_damage.value == cryp.blue_damage.base + cryp.blue_damage.base.pct(80)); + assert!(construct.red_damage.value == construct.red_damage.base + construct.red_damage.base.pct(20)); + assert!(construct.green_damage.value == construct.green_damage.base + construct.green_damage.base.pct(40)); + assert!(construct.blue_damage.value == construct.blue_damage.base + construct.blue_damage.base.pct(80)); return; } diff --git a/server/src/game.rs b/server/src/game.rs index 5eaefbc5..c4509030 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -13,7 +13,7 @@ use failure::err_msg; use account::Account; use rpc::{GameStateParams, GameSkillParams}; -use cryp::{Cryp}; +use construct::{Construct}; use skill::{Skill, Effect, Cast, Resolution, Event, resolution_steps}; use player::{Player}; use instance::{instance_game_finished, global_game_finished}; @@ -29,7 +29,7 @@ pub enum Phase { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct Game { pub id: Uuid, - pub player_cryps: usize, + pub player_constructs: usize, pub player_num: usize, pub players: Vec, pub phase: Phase, @@ -44,7 +44,7 @@ impl Game { pub fn new() -> Game { return Game { id: Uuid::new_v4(), - player_cryps: 0, + player_constructs: 0, player_num: 0, players: vec![], phase: Phase::Start, @@ -61,8 +61,8 @@ impl Game { self } - pub fn set_player_cryps(&mut self, size: usize) -> &mut Game { - self.player_cryps = size; + pub fn set_player_constructs(&mut self, size: usize) -> &mut Game { + self.player_constructs = size; self } @@ -84,12 +84,12 @@ impl Game { return Err(err_msg("player already in game")); } - if player.cryps.iter().all(|c| c.skills.len() == 0) { + if player.constructs.iter().all(|c| c.skills.len() == 0) { info!("WARNING: {:?} has no skills and has forfeited {:?}", player.name, self.id); player.forfeit(); } - let player_description = player.cryps.iter().map(|c| c.name.clone()).collect::>().join(", "); + let player_description = player.constructs.iter().map(|c| c.name.clone()).collect::>().join(", "); self.log.push(format!("{:} has joined the game. [{:}]", player.name, player_description)); self.players.push(player); @@ -105,42 +105,42 @@ impl Game { .ok_or(format_err!("{:?} not in game", id)) } - pub fn cryp_by_id(&mut self, id: Uuid) -> Option<&mut Cryp> { - match self.players.iter_mut().find(|t| t.cryps.iter().any(|c| c.id == id)) { - Some(player) => player.cryps.iter_mut().find(|c| c.id == id), + pub fn construct_by_id(&mut self, id: Uuid) -> Option<&mut Construct> { + match self.players.iter_mut().find(|t| t.constructs.iter().any(|c| c.id == id)) { + Some(player) => player.constructs.iter_mut().find(|c| c.id == id), None => None, } } - pub fn cryp_by_id_take(&mut self, id: Uuid) -> Cryp { - match self.players.iter_mut().find(|t| t.cryps.iter().any(|c| c.id == id)) { + pub fn construct_by_id_take(&mut self, id: Uuid) -> Construct { + match self.players.iter_mut().find(|t| t.constructs.iter().any(|c| c.id == id)) { Some(player) => { - let i = player.cryps.iter().position(|c| c.id == id).unwrap(); - player.cryps.remove(i) + let i = player.constructs.iter().position(|c| c.id == id).unwrap(); + player.constructs.remove(i) } None => panic!("id not in game {:}", id), } } - fn all_cryps(&self) -> Vec { + fn all_constructs(&self) -> Vec { self.players.clone() .into_iter() .flat_map( - |t| t.cryps + |t| t.constructs .into_iter()) - .collect::>() + .collect::>() } - pub fn update_cryp(&mut self, cryp: &mut Cryp) -> &mut Game { - match self.players.iter_mut().find(|t| t.cryps.iter().any(|c| c.id == cryp.id)) { + pub fn update_construct(&mut self, construct: &mut Construct) -> &mut Game { + match self.players.iter_mut().find(|t| t.constructs.iter().any(|c| c.id == construct.id)) { Some(player) => { - let index = player.cryps.iter().position(|t| t.id == cryp.id).unwrap(); - player.cryps.remove(index); - player.cryps.push(cryp.clone()); - player.cryps.sort_unstable_by_key(|c| c.id); + let index = player.constructs.iter().position(|t| t.id == construct.id).unwrap(); + player.constructs.remove(index); + player.constructs.push(construct.clone()); + player.constructs.sort_unstable_by_key(|c| c.id); }, - None => panic!("cryp not in game"), + None => panic!("construct not in game"), }; self @@ -148,7 +148,7 @@ impl Game { pub fn can_start(&self) -> bool { return self.players.len() == self.player_num - && self.players.iter().all(|t| t.cryps.len() == self.player_cryps) + && self.players.iter().all(|t| t.constructs.len() == self.player_constructs) } pub fn start(mut self) -> Game { @@ -198,7 +198,7 @@ impl Game { .filter(|t| t.bot) { let player_player = self.players.iter().find(|t| t.id != mobs.id).unwrap(); - for mob in mobs.cryps.iter() { + for mob in mobs.constructs.iter() { let skill = mob.mob_select_skill(); // info!("{:?} {:?}", mob.name, skill); match skill { @@ -209,8 +209,8 @@ impl Game { // more than once let mut find_target = || { match s.defensive() { - true => &mobs.cryps[rng.gen_range(0, mobs.cryps.len())], - false => &player_player.cryps[rng.gen_range(0, player_player.cryps.len())], + true => &mobs.constructs[rng.gen_range(0, mobs.constructs.len())], + false => &player_player.constructs[rng.gen_range(0, player_player.constructs.len())], } }; @@ -231,7 +231,7 @@ impl Game { match self.add_skill(player_id, mob_id, target_id, s) { Ok(_) => (), Err(e) => { - info!("{:?}", self.cryp_by_id(mob_id)); + info!("{:?}", self.construct_by_id(mob_id)); panic!("{:?} unable to add pve mob skill {:?}", e, s); }, } @@ -242,7 +242,7 @@ impl Game { self } - fn add_skill(&mut self, player_id: Uuid, source_cryp_id: Uuid, target_cryp_id: Option, skill: Skill) -> Result<&mut Game, Error> { + fn add_skill(&mut self, player_id: Uuid, source_construct_id: Uuid, target_construct_id: Option, skill: Skill) -> Result<&mut Game, Error> { // check player in game self.player_by_id(player_id)?; @@ -251,8 +251,8 @@ impl Game { } let final_target_id = match skill.self_targeting() { - true => source_cryp_id, - false => match target_cryp_id { + true => source_construct_id, + false => match target_construct_id { Some(t) => t, None => return Err(err_msg("skill requires a target")), } @@ -260,49 +260,49 @@ impl Game { // target checks { - let target = match self.cryp_by_id(final_target_id) { + let target = match self.construct_by_id(final_target_id) { Some(c) => c, - None => return Err(err_msg("target cryp not in game")), + None => return Err(err_msg("target construct not in game")), }; // fixme for rez if target.is_ko() { - return Err(err_msg("target cryp is ko")); + return Err(err_msg("target construct is ko")); } } - // cryp checks + // construct checks { - let cryp = match self.cryp_by_id(source_cryp_id) { + let construct = match self.construct_by_id(source_construct_id) { Some(c) => c, - None => return Err(err_msg("cryp not in game")), + None => return Err(err_msg("construct not in game")), }; - if cryp.is_ko() { - return Err(err_msg("cryp is ko")); + if construct.is_ko() { + return Err(err_msg("construct is ko")); } - // check the cryp has the skill - if !cryp.knows(skill) { - return Err(err_msg("cryp does not have that skill")); + // check the construct has the skill + if !construct.knows(skill) { + return Err(err_msg("construct does not have that skill")); } - if cryp.skill_on_cd(skill).is_some() { + if construct.skill_on_cd(skill).is_some() { return Err(err_msg("abiltity on cooldown")); } // check here as well so uncastable spells don't go on the stack - if let Some(disable) = cryp.disabled(skill) { + if let Some(disable) = construct.disabled(skill) { return Err(format_err!("skill disabled {:?}", disable)); } } - // replace cryp skill - if let Some(s) = self.stack.iter_mut().position(|s| s.source_cryp_id == source_cryp_id) { + // replace construct skill + if let Some(s) = self.stack.iter_mut().position(|s| s.source_construct_id == source_construct_id) { self.stack.remove(s); } - let skill = Cast::new(source_cryp_id, player_id, final_target_id, skill); + let skill = Cast::new(source_construct_id, player_id, final_target_id, skill); self.stack.push(skill); return Ok(self); @@ -349,7 +349,7 @@ impl Game { let mut sorted = self.stack.clone(); sorted.iter_mut() .for_each(|s| { - let caster = self.cryp_by_id(s.source_cryp_id).unwrap(); + let caster = self.construct_by_id(s.source_construct_id).unwrap(); let speed = caster.skill_speed(s.skill); s.speed = speed; }); @@ -361,19 +361,19 @@ impl Game { self } - fn cryp_aoe_targets(&self, cryp_id: Uuid) -> Vec { + fn construct_aoe_targets(&self, construct_id: Uuid) -> Vec { self.players.iter() - .find(|t| t.cryps.iter().any(|c| c.id == cryp_id)) + .find(|t| t.constructs.iter().any(|c| c.id == construct_id)) .unwrap() - .cryps + .constructs .iter() .map(|c| c.id) .collect() } - pub fn get_targets(&self, skill: Skill, source: &Cryp, target_cryp_id: Uuid) -> Vec { + pub fn get_targets(&self, skill: Skill, source: &Construct, target_construct_id: Uuid) -> Vec { let target_player = self.players.iter() - .find(|t| t.cryps.iter().any(|c| c.id == target_cryp_id)) + .find(|t| t.constructs.iter().any(|c| c.id == target_construct_id)) .unwrap(); if let Some(t) = target_player.taunting() { @@ -381,8 +381,8 @@ impl Game { } match source.skill_is_aoe(skill) { - true => self.cryp_aoe_targets(target_cryp_id), - false => vec![target_cryp_id], + true => self.construct_aoe_targets(target_construct_id), + false => vec![target_construct_id], } } @@ -392,7 +392,7 @@ impl Game { } // find their statuses with ticks - let mut ticks = self.all_cryps() + let mut ticks = self.all_constructs() .iter() .flat_map( |c| c.effects @@ -442,30 +442,30 @@ impl Game { } fn progress_durations(&mut self, resolved: &Vec) -> &mut Game { - for mut cryp in self.all_cryps() { - // info!("progressing durations for {:}", cryp.name); + for mut construct in self.all_constructs() { + // info!("progressing durations for {:}", construct.name); - if cryp.is_ko() { + if construct.is_ko() { continue; } // only reduce cooldowns if no cd was used // have to borrow self for the skill check { - if let Some(skill) = resolved.iter().find(|s| s.source_cryp_id == cryp.id) { + if let Some(skill) = resolved.iter().find(|s| s.source_construct_id == construct.id) { if skill.used_cooldown() { - cryp.skill_set_cd(skill.skill); + construct.skill_set_cd(skill.skill); } else { - cryp.reduce_cooldowns(); + construct.reduce_cooldowns(); } } else { - cryp.reduce_cooldowns(); + construct.reduce_cooldowns(); } } // always reduce durations - cryp.reduce_effect_durations(); - self.update_cryp(&mut cryp); + construct.reduce_effect_durations(); + self.update_construct(&mut construct); } self @@ -536,11 +536,11 @@ impl Game { } pub fn finished(&self) -> bool { - self.players.iter().any(|t| t.cryps.iter().all(|c| c.is_ko())) + self.players.iter().any(|t| t.constructs.iter().all(|c| c.is_ko())) } pub fn winner(&self) -> Option<&Player> { - self.players.iter().find(|t| t.cryps.iter().any(|c| !c.is_ko())) + self.players.iter().find(|t| t.constructs.iter().any(|c| !c.is_ko())) } fn finish(mut self) -> Game { @@ -548,7 +548,7 @@ impl Game { self.log.push(format!("Game finished.")); { - let winner = self.players.iter().find(|t| t.cryps.iter().any(|c| !c.is_ko())); + let winner = self.players.iter().find(|t| t.constructs.iter().any(|c| !c.is_ko())); match winner { Some(w) => self.log.push(format!("Winner: {:}", w.name)), None => self.log.push(format!("Game was drawn.")), @@ -630,7 +630,7 @@ pub fn game_get(tx: &mut Transaction, id: Uuid) -> Result { None => return Err(err_msg("game not found")), }; - // tells from_slice to cast into a cryp + // tells from_slice to cast into a construct let game_bytes: Vec = returned.get("data"); let game = from_slice::(&game_bytes)?; @@ -700,7 +700,7 @@ pub fn game_delete(tx: &mut Transaction, id: Uuid) -> Result<(), Error> { // game // .set_player_num(2) -// .set_player_cryps(3) +// .set_player_constructs(3) // .set_mode(GameMode::Pvp); // game_write(tx, &game)?; @@ -761,7 +761,7 @@ pub fn game_delete(tx: &mut Transaction, id: Uuid) -> Result<(), Error> { // None => return Err(err_msg("game not found")), // }; -// // tells from_slice to cast into a cryp +// // tells from_slice to cast into a construct // let game_bytes: Vec = returned.get("data"); // let game = match from_slice::(&game_bytes) { // Ok(g) => g, @@ -805,7 +805,7 @@ pub fn game_update(tx: &mut Transaction, game: &Game) -> Result<(), Error> { pub fn game_skill(params: GameSkillParams, tx: &mut Transaction, account: &Account) -> Result { let mut game = game_get(tx, params.game_id)?; - game.add_skill(account.id, params.cryp_id, params.target_cryp_id, params.skill)?; + game.add_skill(account.id, params.construct_id, params.target_construct_id, params.skill)?; if game.skill_phase_finished() { game = game.resolve_phase_start(); @@ -830,17 +830,17 @@ pub fn game_ready(params: GameStateParams, tx: &mut Transaction, account: &Accou Ok(game) } -// pub fn game_pve_new(cryp_ids: Vec, mode: GameMode, tx: &mut Transaction, account: &Account) -> Result { -// if cryp_ids.len() == 0 { -// return Err(err_msg("no cryps selected")); +// pub fn game_pve_new(construct_ids: Vec, mode: GameMode, tx: &mut Transaction, account: &Account) -> Result { +// if construct_ids.len() == 0 { +// return Err(err_msg("no constructs selected")); // } -// let cryps = cryp_ids +// let constructs = construct_ids // .iter() -// .map(|id| cryp_get(tx, *id, account.id)) -// .collect::, Error>>()?; +// .map(|id| construct_get(tx, *id, account.id)) +// .collect::, Error>>()?; -// if cryps.len() > 3 { +// if constructs.len() > 3 { // return Err(err_msg("player size too large (3 max)")); // } @@ -850,16 +850,16 @@ pub fn game_ready(params: GameStateParams, tx: &mut Transaction, account: &Accou // game; // .set_player_num(2) -// .set_player_cryps(cryps.len()) +// .set_player_constructs(constructs.len()) // .set_mode(mode); // // create the mob player -// let mob_player = generate_mob_player(mode, &cryps); +// let mob_player = generate_mob_player(mode, &constructs); // // add the players // let mut plr_player = Player::new(account.id); // plr_player -// .set_cryps(cryps); +// .set_constructs(constructs); // game @@ -872,7 +872,7 @@ pub fn game_ready(params: GameStateParams, tx: &mut Transaction, account: &Accou // } // pub fn game_pve(params: GamePveParams, tx: &mut Transaction, account: &Account) -> Result { -// let game = game_pve_new(params.cryp_ids, GameMode::Normal, tx, account)?; +// let game = game_pve_new(params.construct_ids, GameMode::Normal, tx, account)?; // // persist // game_write(tx, &game)?; @@ -887,7 +887,7 @@ pub fn game_instance_new(tx: &mut Transaction, players: Vec, game_id: Uu game .set_player_num(2) - .set_player_cryps(3) + .set_player_constructs(3) .set_instance(instance_id); // create the initiators player @@ -924,11 +924,11 @@ pub fn game_instance_new(tx: &mut Transaction, players: Vec, game_id: Uu #[cfg(test)] mod tests { use game::*; - use cryp::*; + use construct::*; use util::IntPct; fn create_test_game() -> Game { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"pronounced \"creeep\"".to_string()) .learn(Skill::Attack) .learn(Skill::TestStun) @@ -940,7 +940,7 @@ mod tests { .learn(Skill::Stun) .learn(Skill::Block); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"lemongrass tea".to_string()) .learn(Skill::Attack) .learn(Skill::TestStun) @@ -956,7 +956,7 @@ mod tests { game .set_player_num(2) - .set_player_cryps(1); + .set_player_constructs(1); let x_player_id = Uuid::new_v4(); x.account = x_player_id; @@ -976,22 +976,22 @@ mod tests { } fn create_2v2_test_game() -> Game { - let mut i = Cryp::new() + let mut i = Construct::new() .named(&"pretaliate".to_string()) .learn(Skill::Attack) .learn(Skill::TestTouch); - let mut j = Cryp::new() + let mut j = Construct::new() .named(&"poy sian".to_string()) .learn(Skill::Attack) .learn(Skill::TestTouch); - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"pronounced \"creeep\"".to_string()) .learn(Skill::Attack) .learn(Skill::TestTouch); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"lemongrass tea".to_string()) .learn(Skill::Attack) .learn(Skill::TestTouch); @@ -1000,7 +1000,7 @@ mod tests { game .set_player_num(2) - .set_player_cryps(2); + .set_player_constructs(2); let i_player_id = Uuid::new_v4(); i.account = i_player_id; @@ -1028,11 +1028,11 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Attack).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::Attack).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::Attack).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::Attack).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); @@ -1053,11 +1053,11 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::TestStun).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::TestStun).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); @@ -1068,7 +1068,7 @@ mod tests { // should auto progress back to skill phase assert!(game.phase == Phase::Skill); - // assert!(game.player_by_id(y_player.id).cryps[0].is_stunned()); + // assert!(game.player_by_id(y_player.id).constructs[0].is_stunned()); // assert!(game.player_by_id(y_player.id).skills_required() == 0); } @@ -1079,18 +1079,18 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.player_by_id(y_player.id).unwrap().cryp_by_id(y_cryp.id).unwrap().red_damage.force(1000000000); - game.player_by_id(y_player.id).unwrap().cryp_by_id(y_cryp.id).unwrap().speed.force(1000000000); + game.player_by_id(y_player.id).unwrap().construct_by_id(y_construct.id).unwrap().red_damage.force(1000000000); + game.player_by_id(y_player.id).unwrap().construct_by_id(y_construct.id).unwrap().speed.force(1000000000); // just in case // remove all mitigation - game.player_by_id(x_player.id).unwrap().cryp_by_id(x_cryp.id).unwrap().red_life.force(0); + game.player_by_id(x_player.id).unwrap().construct_by_id(x_construct.id).unwrap().red_life.force(0); - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::TestStun).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::Attack).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::TestStun).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::Attack).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); @@ -1098,7 +1098,7 @@ mod tests { assert!(game.skill_phase_finished()); game = game.resolve_phase_start(); - assert!(!game.player_by_id(y_player.id).unwrap().cryps[0].is_stunned()); + assert!(!game.player_by_id(y_player.id).unwrap().constructs[0].is_stunned()); assert!(game.phase == Phase::Finish); } @@ -1109,18 +1109,18 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); // should auto progress back to skill phase assert!(game.phase == Phase::Skill); - assert!(game.player_by_id(y_player.id).unwrap().cryps[0].skill_on_cd(Skill::Block).is_none()); - assert!(game.player_by_id(y_player.id).unwrap().cryps[0].skill_on_cd(Skill::Stun).is_some()); - assert!(game.player_by_id(x_player.id).unwrap().cryps[0].skill_on_cd(Skill::Block).is_none()); + assert!(game.player_by_id(y_player.id).unwrap().constructs[0].skill_on_cd(Skill::Block).is_none()); + assert!(game.player_by_id(y_player.id).unwrap().constructs[0].skill_on_cd(Skill::Stun).is_some()); + assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Block).is_none()); - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); @@ -1129,20 +1129,20 @@ mod tests { // should auto progress back to skill phase assert!(game.phase == Phase::Skill); - assert!(game.player_by_id(y_player.id).unwrap().cryps[0].skill_on_cd(Skill::Stun).is_some()); + assert!(game.player_by_id(y_player.id).unwrap().constructs[0].skill_on_cd(Skill::Stun).is_some()); // second round // now we block and it should go back on cd - // game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Stun).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + // game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::Stun).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); - assert!(game.player_by_id(x_player.id).unwrap().cryps[0].skill_on_cd(Skill::Stun).is_none()); - assert!(game.player_by_id(y_player.id).unwrap().cryps[0].skill_on_cd(Skill::Block).is_none()); + assert!(game.player_by_id(x_player.id).unwrap().constructs[0].skill_on_cd(Skill::Stun).is_none()); + assert!(game.player_by_id(y_player.id).unwrap().constructs[0].skill_on_cd(Skill::Block).is_none()); } #[test] @@ -1152,11 +1152,11 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.add_skill(x_player.id, x_cryp.id, None, Skill::TestParry).unwrap(); - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestStun).unwrap(); + game.add_skill(x_player.id, x_construct.id, None, Skill::TestParry).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestStun).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); @@ -1164,9 +1164,9 @@ mod tests { game = game.resolve_phase_start(); // should not be stunned because of parry - assert!(game.player_by_id(x_player.id).unwrap().cryps[0].is_stunned() == false); + assert!(game.player_by_id(x_player.id).unwrap().constructs[0].is_stunned() == false); // riposte - assert_eq!(game.player_by_id(y_player.id).unwrap().cryps[0].green_life(), (1024 - x_cryp.red_damage().pct(Skill::Riposte.multiplier()))); + assert_eq!(game.player_by_id(y_player.id).unwrap().constructs[0].green_life(), (1024 - x_construct.red_damage().pct(Skill::Riposte.multiplier()))); } #[test] @@ -1176,29 +1176,29 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Corrupt); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Corrupt); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Corrupt).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Corrupt).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } // apply buff - game.add_skill(x_player.id, x_cryp.id, None, Skill::Corrupt).unwrap(); + game.add_skill(x_player.id, x_construct.id, None, Skill::Corrupt).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); - assert!(game.cryp_by_id(x_cryp.id).unwrap().affected(Effect::Corrupt)); + assert!(game.construct_by_id(x_construct.id).unwrap().affected(Effect::Corrupt)); // attack and receive debuff - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); - assert!(game.cryp_by_id(y_cryp.id).unwrap().affected(Effect::Corruption)); + assert!(game.construct_by_id(y_construct.id).unwrap().affected(Effect::Corruption)); } #[test] @@ -1208,21 +1208,21 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Scatter); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Scatter); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Scatter).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Scatter).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } // apply buff - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Scatter).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::Scatter).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); - assert!(game.cryp_by_id(x_cryp.id).unwrap().affected(Effect::Scatter)); + assert!(game.construct_by_id(x_construct.id).unwrap().affected(Effect::Scatter)); let Resolution { source: _, target: _, event } = game.resolved.pop().unwrap(); match event { @@ -1237,13 +1237,13 @@ mod tests { } // attack and receive scatter hit - game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::Attack).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::Attack).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); let Resolution { source: _, target, event } = game.resolved.pop().unwrap(); - assert_eq!(target.id, y_cryp.id); + assert_eq!(target.id, y_construct.id); match event { Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::Attack.multiplier()) >> 1), @@ -1258,30 +1258,30 @@ mod tests { // let x_player = game.players[0].clone(); // let y_player = game.players[1].clone(); - // let x_cryp = x_player.cryps[0].clone(); - // let y_cryp = y_player.cryps[0].clone(); + // let x_construct = x_player.constructs[0].clone(); + // let y_construct = y_player.constructs[0].clone(); - // game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Hostility); + // game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Hostility); - // while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Hostility).is_some() { - // game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + // while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Hostility).is_some() { + // game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); // } // // apply buff - // game.add_skill(x_player.id, x_cryp.id, Some(x_cryp.id), Skill::Hostility).unwrap(); + // game.add_skill(x_player.id, x_construct.id, Some(x_construct.id), Skill::Hostility).unwrap(); // game.player_ready(x_player.id).unwrap(); // game.player_ready(y_player.id).unwrap(); // game = game.resolve_phase_start(); - // assert!(game.cryp_by_id(x_cryp.id).unwrap().affected(Effect::Hostility)); + // assert!(game.construct_by_id(x_construct.id).unwrap().affected(Effect::Hostility)); // // attack and receive debuff - // game.add_skill(y_player.id, y_cryp.id, Some(x_cryp.id), Skill::TestAttack).unwrap(); + // game.add_skill(y_player.id, y_construct.id, Some(x_construct.id), Skill::TestAttack).unwrap(); // game.player_ready(x_player.id).unwrap(); // game.player_ready(y_player.id).unwrap(); // game = game.resolve_phase_start(); // info!("{:#?}", game); - // assert!(game.cryp_by_id(y_cryp.id).unwrap().affected(Effect::Hatred)); + // assert!(game.construct_by_id(y_construct.id).unwrap().affected(Effect::Hatred)); // } #[test] @@ -1291,21 +1291,21 @@ mod tests { let i_player = game.players[0].clone(); let x_player = game.players[1].clone(); - let i_cryp = i_player.cryps[0].clone(); - let j_cryp = i_player.cryps[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = x_player.cryps[1].clone(); + let i_construct = i_player.constructs[0].clone(); + let j_construct = i_player.constructs[1].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = x_player.constructs[1].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Ruin); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Ruin); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Ruin).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Ruin).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } - game.add_skill(i_player.id, i_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Ruin).unwrap(); - game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, i_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, j_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(i_construct.id), Skill::Ruin).unwrap(); + game.add_skill(x_player.id, y_construct.id, Some(i_construct.id), Skill::TestTouch).unwrap(); game.player_ready(i_player.id).unwrap(); game.player_ready(x_player.id).unwrap(); @@ -1316,7 +1316,7 @@ mod tests { .into_iter() .filter(|r| { let Resolution { source, target: _, event } = r; - match source.id == x_cryp.id { + match source.id == x_construct.id { true => match event { Event::Effect { effect, duration, skill: _ } => { assert!(*effect == Effect::Stun); @@ -1341,21 +1341,21 @@ mod tests { let i_player = game.players[0].clone(); let x_player = game.players[1].clone(); - let i_cryp = i_player.cryps[0].clone(); - let j_cryp = i_player.cryps[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = x_player.cryps[1].clone(); + let i_construct = i_player.constructs[0].clone(); + let j_construct = i_player.constructs[1].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = x_player.constructs[1].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Taunt); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Taunt); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Taunt).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Taunt).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } - game.add_skill(i_player.id, i_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Taunt).unwrap(); - game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, i_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, j_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(i_construct.id), Skill::Taunt).unwrap(); + game.add_skill(x_player.id, y_construct.id, Some(i_construct.id), Skill::TestTouch).unwrap(); game.player_ready(i_player.id).unwrap(); game.player_ready(x_player.id).unwrap(); @@ -1365,8 +1365,8 @@ mod tests { assert!(game.resolved.len() == 5); while let Some(r) = game.resolved.pop() { let Resolution { source , target, event: _ } = r; - if [i_cryp.id, j_cryp.id].contains(&source.id) { - assert!(target.id == x_cryp.id); + if [i_construct.id, j_construct.id].contains(&source.id) { + assert!(target.id == x_construct.id); } } } @@ -1378,15 +1378,15 @@ mod tests { let i_player = game.players[0].clone(); let x_player = game.players[1].clone(); - let i_cryp = i_player.cryps[0].clone(); - let j_cryp = i_player.cryps[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = x_player.cryps[1].clone(); + let i_construct = i_player.constructs[0].clone(); + let j_construct = i_player.constructs[1].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = x_player.constructs[1].clone(); - game.add_skill(i_player.id, i_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, i_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(i_player.id, j_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(i_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, y_construct.id, Some(i_construct.id), Skill::TestTouch).unwrap(); game.player_ready(i_player.id).unwrap(); game.player_ready(x_player.id).unwrap(); @@ -1396,17 +1396,17 @@ mod tests { assert!([Phase::Skill, Phase::Finish].contains(&game.phase)); - // kill a cryp - game.player_by_id(i_player.id).unwrap().cryp_by_id(i_cryp.id).unwrap().green_life.reduce(u64::max_value()); + // kill a construct + game.player_by_id(i_player.id).unwrap().construct_by_id(i_construct.id).unwrap().green_life.reduce(u64::max_value()); assert!(game.player_by_id(i_player.id).unwrap().skills_required() == 1); assert!(game.player_by_id(x_player.id).unwrap().skills_required() == 2); // add some more skills - game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(j_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, y_cryp.id, Some(j_cryp.id), Skill::TestTouch).unwrap(); - assert!(game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::TestTouch).is_err()); + game.add_skill(i_player.id, j_construct.id, Some(x_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(j_construct.id), Skill::TestTouch).unwrap(); + game.add_skill(x_player.id, y_construct.id, Some(j_construct.id), Skill::TestTouch).unwrap(); + assert!(game.add_skill(x_player.id, x_construct.id, Some(i_construct.id), Skill::TestTouch).is_err()); game.player_ready(i_player.id).unwrap(); game.player_ready(x_player.id).unwrap(); @@ -1426,33 +1426,33 @@ mod tests { let x_player = game.players[0].clone(); let y_player = game.players[1].clone(); - let x_cryp = x_player.cryps[0].clone(); - let y_cryp = y_player.cryps[0].clone(); + let x_construct = x_player.constructs[0].clone(); + let y_construct = y_player.constructs[0].clone(); - // make the purify cryp super fast so it beats out decay - game.cryp_by_id(y_cryp.id).unwrap().speed.force(10000000); + // make the purify construct super fast so it beats out decay + game.construct_by_id(y_construct.id).unwrap().speed.force(10000000); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Decay); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Decay).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Decay); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Decay).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Siphon); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Siphon).is_some() { - game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Siphon); + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Siphon).is_some() { + game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } - game.cryp_by_id(y_cryp.id).unwrap().learn_mut(Skill::Purify); - while game.cryp_by_id(y_cryp.id).unwrap().skill_on_cd(Skill::Purify).is_some() { - game.cryp_by_id(y_cryp.id).unwrap().reduce_cooldowns(); + game.construct_by_id(y_construct.id).unwrap().learn_mut(Skill::Purify); + while game.construct_by_id(y_construct.id).unwrap().skill_on_cd(Skill::Purify).is_some() { + game.construct_by_id(y_construct.id).unwrap().reduce_cooldowns(); } // apply buff - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Decay).unwrap(); + game.add_skill(x_player.id, x_construct.id, Some(y_construct.id), Skill::Decay).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); - assert!(game.cryp_by_id(y_cryp.id).unwrap().affected(Effect::Decay)); + assert!(game.construct_by_id(y_construct.id).unwrap().affected(Effect::Decay)); let Resolution { source: _, target: _, event } = game.resolved.pop().unwrap(); match event { @@ -1463,7 +1463,7 @@ mod tests { game.resolved.clear(); // remove - game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::Purify).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(y_construct.id), Skill::Purify).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); @@ -1476,14 +1476,14 @@ mod tests { } }; - game.add_skill(y_player.id, x_cryp.id, Some(y_cryp.id), Skill::Siphon).unwrap(); + game.add_skill(y_player.id, x_construct.id, Some(y_construct.id), Skill::Siphon).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); game.resolved.clear(); - game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::Purify).unwrap(); + game.add_skill(y_player.id, y_construct.id, Some(y_construct.id), Skill::Purify).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); diff --git a/server/src/instance.rs b/server/src/instance.rs index a35192bf..d2de34ea 100644 --- a/server/src/instance.rs +++ b/server/src/instance.rs @@ -16,7 +16,7 @@ use chrono::Duration; use rpc::{InstanceLobbyParams, InstanceJoinParams, InstanceReadyParams, InstanceStateParams}; use account::Account; use player::{Player, player_create, player_get, player_global_update}; -use cryp::{Cryp, cryp_get}; +use construct::{Construct, construct_get}; use mob::{instance_mobs}; use game::{Game, Phase, game_get, game_write}; use item::{Item}; @@ -144,8 +144,8 @@ impl Instance { self.open = false; self.players = iter::repeat_with(|| { let bot_id = Uuid::new_v4(); - let cryps = instance_mobs(bot_id); - let mut p = Player::new(bot_id, &name(), cryps).set_bot(true); + let constructs = instance_mobs(bot_id); + let mut p = Player::new(bot_id, &name(), constructs).set_bot(true); p.set_ready(true); p }) @@ -202,8 +202,8 @@ impl Instance { self.players[i].set_ready(v); // start the game even if afk noobs have no skills - if !self.phase_timed_out() && self.players[i].cryps.iter().all(|c| c.skills.len() == 0) { - return Err(err_msg("your cryps have no skills")); + if !self.phase_timed_out() && self.players[i].constructs.iter().all(|c| c.skills.len() == 0) { + return Err(err_msg("your constructs have no skills")); } // create a game object if both players are ready @@ -247,7 +247,7 @@ impl Instance { game .set_player_num(2) - .set_player_cryps(3) + .set_player_constructs(3) .set_instance(self.id); // create the initiators player @@ -472,17 +472,17 @@ impl Instance { Ok(self) } - pub fn vbox_apply(mut self, account: Uuid, index: usize, cryp_id: Uuid) -> Result { + pub fn vbox_apply(mut self, account: Uuid, index: usize, construct_id: Uuid) -> Result { self.vbox_action_allowed(account)?; self.account_player(account)? - .vbox_apply(index, cryp_id)?; + .vbox_apply(index, construct_id)?; Ok(self) } - pub fn vbox_unequip(mut self, account: Uuid, target: Item, cryp_id: Uuid) -> Result { + pub fn vbox_unequip(mut self, account: Uuid, target: Item, construct_id: Uuid) -> Result { self.vbox_action_allowed(account)?; self.account_player(account)? - .vbox_unequip(target, cryp_id)?; + .vbox_unequip(target, construct_id)?; Ok(self) } } @@ -627,7 +627,7 @@ pub fn instance_new(params: InstanceLobbyParams, tx: &mut Transaction, account: }; instance = instance_create(tx, instance)?; - let join_params = InstanceJoinParams { instance_id: instance.id, cryp_ids: params.cryp_ids }; + let join_params = InstanceJoinParams { instance_id: instance.id, construct_ids: params.construct_ids }; instance_join(join_params, tx, account) } @@ -635,16 +635,16 @@ pub fn instance_new(params: InstanceLobbyParams, tx: &mut Transaction, account: pub fn instance_join(params: InstanceJoinParams, tx: &mut Transaction, account: &Account) -> Result { let mut instance = instance_get(tx, params.instance_id)?; - let cryps = params.cryp_ids + let constructs = params.construct_ids .iter() - .map(|id| cryp_get(tx, *id, account.id)) - .collect::, Error>>()?; + .map(|id| construct_get(tx, *id, account.id)) + .collect::, Error>>()?; - if cryps.len() != 3 { + if constructs.len() != 3 { return Err(format_err!("incorrect player size. ({:})", 3)); } - let player = player_create(tx, Player::new(account.id, &account.name, cryps), instance.id, account)?; + let player = player_create(tx, Player::new(account.id, &account.name, constructs), instance.id, account)?; instance.add_player(player)?; @@ -736,8 +736,8 @@ mod tests { .add_bots(); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let player = Player::new(player_account, &"test".to_string(), cryps).set_bot(true); + let constructs = instance_mobs(player_account); + let player = Player::new(player_account, &"test".to_string(), constructs).set_bot(true); let player_id = player.id; instance.add_player(player).expect("could not add player"); @@ -754,8 +754,8 @@ mod tests { fn instance_bot_vbox_test() { let instance = Instance::new(); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let _player = Player::new(player_account, &"test".to_string(), cryps).set_bot(true); + let constructs = instance_mobs(player_account); + let _player = Player::new(player_account, &"test".to_string(), constructs).set_bot(true); } #[test] @@ -767,16 +767,16 @@ mod tests { assert_eq!(instance.max_players, 2); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let player = Player::new(player_account, &"a".to_string(), cryps); + let constructs = instance_mobs(player_account); + let player = Player::new(player_account, &"a".to_string(), constructs); let a_id = player.id; instance.add_player(player).expect("could not add player"); assert!(!instance.can_start()); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let player = Player::new(player_account, &"b".to_string(), cryps); + let constructs = instance_mobs(player_account); + let player = Player::new(player_account, &"b".to_string(), constructs); let b_id = player.id; instance.add_player(player).expect("could not add player"); @@ -806,16 +806,16 @@ mod tests { .expect("could not create instance"); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let player = Player::new(player_account, &"a".to_string(), cryps); + let constructs = instance_mobs(player_account); + let player = Player::new(player_account, &"a".to_string(), constructs); let a_id = player.id; instance.add_player(player).expect("could not add player"); assert!(!instance.can_start()); let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let player = Player::new(player_account, &"b".to_string(), cryps); + let constructs = instance_mobs(player_account); + let player = Player::new(player_account, &"b".to_string(), constructs); let b_id = player.id; instance.add_player(player).expect("could not add player"); diff --git a/server/src/item.rs b/server/src/item.rs index f72f8dbd..3724a547 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -1,6 +1,6 @@ use skill::{Skill, Effect, Colour}; use spec::{Spec}; -use cryp::{Colours}; +use construct::{Colours}; #[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)] pub enum Item { @@ -277,46 +277,46 @@ impl Item { 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier()), - Item::Stun => format!("Stun target cryp for {:?}T", + Item::Stun => format!("Stun target construct for {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Buff => format!("Increase target cryp red damage and speed by {:?}%", + Item::Buff => format!("Increase target construct red damage and speed by {:?}%", self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100), - Item::Debuff => format!("Slow target cryp speed by {:?}%", + Item::Debuff => format!("Slow target construct speed by {:?}%", 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier()), // specs // Base Item::Damage => format!("Base ITEM for increased DAMAGE. DAMAGE determines the power of your SKILLS."), Item::Life => format!("Base ITEM for increased LIFE. - When your CRYP reaches 0 GreenLife it becomes KO and cannot cast SKILLS."), + When your CONSTRUCT reaches 0 GreenLife it becomes KO and cannot cast SKILLS."), Item::Speed => format!("Base ITEM for increased SPEED. SPEED determines the order in which skills resolve."), // Lifes Upgrades - Item::GreenLifeI => format!("Increases CRYP GreenLife. - When your CRYP reaches 0 GreenLife it becomes KO and cannot cast SKILLS."), - Item::RedLifeI => format!("Increases CRYP RedLife. - Red damage dealt to your cryp reduces RedLife before GreenLife."), - Item::BlueLifeI => format!("Increases CRYP BlueLife. - Blue damage dealt to your cryp reduces BlueLife before GreenLife."), - Item::GRLI => format!("Increases CRYP GreenLife + RedLife"), - Item::GBLI => format!("Increases CRYP GreenLife + BlueLife"), - Item::RBLI => format!("Increases CRYP RedLife + BlueLife"), + Item::GreenLifeI => format!("Increases CONSTRUCT GreenLife. + When your CONSTRUCT reaches 0 GreenLife it becomes KO and cannot cast SKILLS."), + Item::RedLifeI => format!("Increases CONSTRUCT RedLife. + Red damage dealt to your construct reduces RedLife before GreenLife."), + Item::BlueLifeI => format!("Increases CONSTRUCT BlueLife. + Blue damage dealt to your construct reduces BlueLife before GreenLife."), + Item::GRLI => format!("Increases CONSTRUCT GreenLife + RedLife"), + Item::GBLI => format!("Increases CONSTRUCT GreenLife + BlueLife"), + Item::RBLI => format!("Increases CONSTRUCT RedLife + BlueLife"), // Damage Upgrades - Item::RedDamageI => format!("Increases CRYP RedDamage."), - Item::BlueDamageI => format!("Increases CRYP BlueDamage."), - Item::GreenDamageI => format!("Increases CRYP GreenDamage."), - Item::GRDI => format!("Increases CRYP GreenDamage + RedDamage."), - Item::GBDI => format!("Increases CRYP GreenDamage + BlueDamage."), - Item::RBDI => format!("Increases CRYP RedDamage + BlueDamage."), + Item::RedDamageI => format!("Increases CONSTRUCT RedDamage."), + Item::BlueDamageI => format!("Increases CONSTRUCT BlueDamage."), + Item::GreenDamageI => format!("Increases CONSTRUCT GreenDamage."), + Item::GRDI => format!("Increases CONSTRUCT GreenDamage + RedDamage."), + Item::GBDI => format!("Increases CONSTRUCT GreenDamage + BlueDamage."), + Item::RBDI => format!("Increases CONSTRUCT RedDamage + BlueDamage."), // Speed Upgrades - Item::RedSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), - Item::BlueSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), - Item::GreenSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), - Item::GRSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), - Item::GBSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), - Item::RBSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), + Item::RedSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), + Item::BlueSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), + Item::GreenSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), + Item::GRSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), + Item::GBSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), + Item::RBSpeedI => format!("Increases CONSTRUCT SPEED and provides COLOUR BONUSES"), // Skills <- need to move effect mulltipliers into skills Item::Amplify => format!("Increase red and blue power by {:?}%. Lasts {:?}T", @@ -324,7 +324,7 @@ impl Item { self.into_skill().unwrap().effect().first().unwrap().get_duration()), Item::Banish => format!("Banish target for {:?}T. - Banished cryps are immune to all skills and effects.", + Banished constructs are immune to all skills and effects.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), Item::Blast => format!("Deals blue damage {:?}% blue power.", self.into_skill().unwrap().multiplier()), @@ -333,7 +333,7 @@ impl Item { "Hits twice for red and blue damage. Damage is random 0 to 30% + {:?}% red and blue power.", self.into_skill().unwrap().multiplier()), - Item::Clutch => format!("Cryp cannot be KO'd while active. + Item::Clutch => format!("Construct cannot be KO'd while active. Additionally provides immunity to disables."), Item::Corrupt => format!( @@ -370,7 +370,7 @@ impl Item { Item::Heal => format!("Heals for {:?}% green power.", self.into_skill().unwrap().multiplier()), Item::Hex => format!("Blue based skill that applies Hex for {:?}T. \ - Hexed targets cannot cast any skills.", + Hexed targets cannot cast any skills.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -389,10 +389,10 @@ impl Item { "Self targetting skill. Recharges RedLife for", self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect().first().unwrap().get_duration(), - "If a red skill is parried the cryp will riposte the source dealing red damage", + "If a red skill is parried the construct will riposte the source dealing red damage", Skill::Riposte.multiplier()), - Item::Purge => format!("Remove buffs from target cryp"), + Item::Purge => format!("Remove buffs from target construct"), Item::Purify => format!( "Remove debuffs and heals for {:?}% green power per debuff removed.", @@ -406,11 +406,11 @@ impl Item { self.into_skill().unwrap().multiplier()), Item::Ruin => format!( - "Team wide Stun for {:?}T. Stunned cryps are unable to cast skills.", + "Team wide Stun for {:?}T. Stunned constructs are unable to cast skills.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - + Item::Scatter => format!( - "Caster links with target. Linked cryps split incoming damage evenly. Recharges target blue shield {:?}% of blue power", + "Caster links with target. Linked constructs split incoming damage evenly. Recharges target blue shield {:?}% of blue power", self.into_skill().unwrap().multiplier()), Item::Silence => format!( diff --git a/server/src/main.rs b/server/src/main.rs index 39e51e00..bda90620 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,7 +1,7 @@ extern crate rand; extern crate uuid; extern crate tungstenite; -extern crate bcrypt; +extern crate bconstructt; extern crate chrono; extern crate dotenv; @@ -18,7 +18,7 @@ extern crate fern; #[macro_use] extern crate log; mod account; -mod cryp; +mod construct; mod game; mod instance; mod item; @@ -51,7 +51,7 @@ fn setup_logger() -> Result<(), fern::InitError> { .level_for("tungstenite", log::LevelFilter::Info) .level(log::LevelFilter::Debug) .chain(std::io::stdout()) - .chain(fern::log_file("log/cryps.log")?) + .chain(fern::log_file("log/constructs.log")?) .apply()?; Ok(()) } diff --git a/server/src/mob.rs b/server/src/mob.rs index d04109c7..e97e1c86 100644 --- a/server/src/mob.rs +++ b/server/src/mob.rs @@ -4,10 +4,10 @@ use rand::prelude::*; use rand::distributions::Alphanumeric; use std::iter; -use cryp::{Cryp}; +use construct::{Construct}; use skill::{Skill}; -pub fn generate_mob() -> Cryp { +pub fn generate_mob() -> Construct { let mut rng = thread_rng(); let name: String = iter::repeat(()) @@ -15,86 +15,86 @@ pub fn generate_mob() -> Cryp { .take(8) .collect(); - let mob = Cryp::new() + let mob = Construct::new() .named(&name); return mob; } -// fn quick_game(player_size: usize) -> Vec { +// fn quick_game(player_size: usize) -> Vec { // iter::repeat_with(|| // generate_mob() // .set_account(Uuid::nil()) // .learn(Skill::Attack)) // .take(player_size) -// .collect::>() +// .collect::>() // } -pub fn instance_mobs(player_id: Uuid) -> Vec { +pub fn instance_mobs(player_id: Uuid) -> Vec { iter::repeat_with(|| generate_mob() .set_account(player_id)) // .learn(Skill::Attack)) .take(3) - .collect::>() + .collect::>() } -// fn zone_3v2_attack(player_lvl: u8) -> Vec { -// let x = Cryp::new() +// fn zone_3v2_attack(player_lvl: u8) -> Vec { +// let x = Construct::new() // .named(&"hench".to_string()) // .learn(Skill::Attack); -// let y = Cryp::new() +// let y = Construct::new() // .named(&"bench".to_string()) // .learn(Skill::Attack); // return vec![x, y]; // } -// fn zone_2v2_caster(player_lvl: u8) -> Vec { -// let x = Cryp::new() +// fn zone_2v2_caster(player_lvl: u8) -> Vec { +// let x = Construct::new() // .named(&"robe".to_string()) // .learn(Skill::Blast); -// let y = Cryp::new() +// let y = Construct::new() // .named(&"wizard hat".to_string()) // .learn(Skill::Blast); // return vec![x, y]; // } -// fn zone_3v3_melee_miniboss(player_lvl: u8) -> Vec { -// let x = Cryp::new() +// fn zone_3v3_melee_miniboss(player_lvl: u8) -> Vec { +// let x = Construct::new() // .named(&"jungle juice".to_string()) // .learn(Skill::Attack); -// let y = Cryp::new() +// let y = Construct::new() // .named(&"bamboo basher".to_string()) // .learn(Skill::Attack) // .learn(Skill::Stun); -// let z = Cryp::new() +// let z = Construct::new() // .named(&"lemongrass tea".to_string()) // .learn(Skill::Attack); // return vec![x, y, z]; // } -// fn zone_3v3_healer_boss(player_lvl: u8) -> Vec { -// let x = Cryp::new() +// fn zone_3v3_healer_boss(player_lvl: u8) -> Vec { +// let x = Construct::new() // .named(&"coinage".to_string()) // .learn(Skill::Attack) // .learn(Skill::Parry) // .learn(Skill::Block); -// let y = Cryp::new() +// let y = Construct::new() // .named(&"wololo".to_string()) // // big strong // // .learn(Skill::Blast) // .learn(Skill::Heal) // .learn(Skill::Triage); -// let z = Cryp::new() +// let z = Construct::new() // .named(&"quarry".to_string()) // .learn(Skill::Attack) // .learn(Skill::Parry) @@ -104,22 +104,22 @@ pub fn instance_mobs(player_id: Uuid) -> Vec { // } -// pub fn generate_mob_player(mode: GameMode, cryps: &Vec) -> Player { +// pub fn generate_mob_player(mode: GameMode, constructs: &Vec) -> Player { // let mut mob_player = Player::new(Uuid::nil()); -// let cryp_lvl = cryps.iter().max_by_key(|c| c.lvl).unwrap().lvl; -// let player_size = cryps.len(); +// let construct_lvl = constructs.iter().max_by_key(|c| c.lvl).unwrap().lvl; +// let player_size = constructs.len(); // let mobs = match mode { -// GameMode::Normal => quick_game(cryp_lvl, player_size), -// GameMode::Zone3v2Attack => zone_3v2_attack(cryp_lvl), -// GameMode::Zone2v2Caster => zone_2v2_caster(cryp_lvl), -// GameMode::Zone3v3MeleeMiniboss => zone_3v3_melee_miniboss(cryp_lvl), -// GameMode::Zone3v3HealerBoss => zone_3v3_healer_boss(cryp_lvl), +// GameMode::Normal => quick_game(construct_lvl, player_size), +// GameMode::Zone3v2Attack => zone_3v2_attack(construct_lvl), +// GameMode::Zone2v2Caster => zone_2v2_caster(construct_lvl), +// GameMode::Zone3v3MeleeMiniboss => zone_3v3_melee_miniboss(construct_lvl), +// GameMode::Zone3v3HealerBoss => zone_3v3_healer_boss(construct_lvl), // _ => panic!("{:?} not handled for pve mobs", mode), // }; -// mob_player.set_cryps(mobs); +// mob_player.set_constructs(mobs); // return mob_player; diff --git a/server/src/player.rs b/server/src/player.rs index 50addc8d..7ff816ff 100644 --- a/server/src/player.rs +++ b/server/src/player.rs @@ -9,10 +9,10 @@ use failure::Error; use failure::err_msg; use account::Account; -use cryp::{Cryp, Colours, cryp_get}; +use construct::{Construct, Colours, construct_get}; use vbox::{Vbox}; use item::{Item, ItemEffect}; -use rpc::{PlayerCrypsSetParams}; +use rpc::{PlayerConstructsSetParams}; use instance::{Instance}; use skill::{Effect}; @@ -30,20 +30,20 @@ pub struct Player { pub name: String, pub vbox: Vbox, pub score: Score, - pub cryps: Vec, + pub constructs: Vec, pub bot: bool, pub ready: bool, pub warnings: u8, } impl Player { - pub fn new(account: Uuid, name: &String, cryps: Vec) -> Player { + pub fn new(account: Uuid, name: &String, constructs: Vec) -> Player { Player { id: account, name: name.clone(), vbox: Vbox::new(), score: Score { wins: 0, losses: 0 }, - cryps, + constructs, bot: false, ready: false, warnings: 0, @@ -66,8 +66,8 @@ impl Player { } pub fn forfeit(&mut self) -> &mut Player { - for cryp in self.cryps.iter_mut() { - cryp.force_ko(); + for construct in self.constructs.iter_mut() { + construct.force_ko(); } self } @@ -84,19 +84,19 @@ impl Player { self } - pub fn cryp_get(&mut self, id: Uuid) -> Result<&mut Cryp, Error> { - self.cryps.iter_mut().find(|c| c.id == id).ok_or(err_msg("cryp not found")) + pub fn construct_get(&mut self, id: Uuid) -> Result<&mut Construct, Error> { + self.constructs.iter_mut().find(|c| c.id == id).ok_or(err_msg("construct not found")) } pub fn autobuy(&mut self) -> &mut Player { let mut rng = thread_rng(); - // first check if any cryps have no skills + // first check if any constructs have no skills // if there is one find an item in vbox that gives a skill - while let Some(c) = self.cryps.iter().position(|c| c.skills.len() == 0) { + while let Some(c) = self.constructs.iter().position(|c| c.skills.len() == 0) { if let Some(s) = self.vbox.bound.iter().position(|v| v.into_skill().is_some()) { - let cryp_id = self.cryps[c].id; - self.vbox_apply(s, cryp_id).expect("could not apply"); + let construct_id = self.constructs[c].id; + self.vbox_apply(s, construct_id).expect("could not apply"); continue; } info!("no skills available..."); @@ -106,23 +106,23 @@ impl Player { // inb4 montecarlo gan loop { - let (target_cryp_i, target_cryp_id) = match self.cryps.iter().any(|c| c.skills.len() < 3) { + let (target_construct_i, target_construct_id) = match self.constructs.iter().any(|c| c.skills.len() < 3) { true => { - let mut target_cryp_i = 0; - for (j, c) in self.cryps.iter().enumerate() { - if c.skills.len() < self.cryps[target_cryp_i].skills.len() { - target_cryp_i = j; + let mut target_construct_i = 0; + for (j, c) in self.constructs.iter().enumerate() { + if c.skills.len() < self.constructs[target_construct_i].skills.len() { + target_construct_i = j; } } - (target_cryp_i, self.cryps[target_cryp_i].id) + (target_construct_i, self.constructs[target_construct_i].id) }, false => { let i = rng.gen_range(0, 3); - (i, self.cryps[i].id) + (i, self.constructs[i].id) }, }; - let needs_skills = self.cryps[target_cryp_i].skills.len() < 3; + let needs_skills = self.constructs[target_construct_i].skills.len() < 3; let group_i = match needs_skills { true => 1, false => 2, @@ -161,7 +161,7 @@ impl Player { // first 2 colours can be whatever self.vbox_combine(vec![0, 1, combo_i]).ok(); let item_i = self.vbox.bound.len() - 1; - self.vbox_apply(item_i, target_cryp_id).ok(); + self.vbox_apply(item_i, target_construct_id).ok(); } return self; @@ -188,7 +188,7 @@ impl Player { Ok(self) } - pub fn vbox_apply(&mut self, index: usize, cryp_id: Uuid) -> Result<&mut Player, Error> { + pub fn vbox_apply(&mut self, index: usize, construct_id: Uuid) -> Result<&mut Player, Error> { if self.vbox.bound.get(index).is_none() { return Err(format_err!("no item at index {:?}", index)); } @@ -198,31 +198,31 @@ impl Player { match item.effect() { Some(ItemEffect::Skill) => { let skill = item.into_skill().ok_or(format_err!("item {:?} has no associated skill", item))?; - let cryp = self.cryp_get(cryp_id)?; + let construct = self.construct_get(construct_id)?; // done here because i teach them a tonne of skills for tests let max_skills = 3; - if cryp.skills.len() >= max_skills { - return Err(format_err!("cryp at max skills ({:?})", max_skills)); + if construct.skills.len() >= max_skills { + return Err(format_err!("construct at max skills ({:?})", max_skills)); } - if cryp.knows(skill) { - return Err(format_err!("cryp already knows skill ({:?})" , skill)); + if construct.knows(skill) { + return Err(format_err!("construct already knows skill ({:?})" , skill)); } - cryp.learn_mut(skill); + construct.learn_mut(skill); }, Some(ItemEffect::Spec) => { let spec = item.into_spec().ok_or(format_err!("item {:?} has no associated spec", item))?; - let cryp = self.cryp_get(cryp_id)?; - cryp.spec_add(spec)?; + let construct = self.construct_get(construct_id)?; + construct.spec_add(spec)?; }, - None => return Err(err_msg("item has no effect on cryps")), + None => return Err(err_msg("item has no effect on constructs")), } // now the item has been applied // recalculate the stats of the whole player - let player_colours = self.cryps.iter().fold(Colours::new(), |tc, c| { + let player_colours = self.constructs.iter().fold(Colours::new(), |tc, c| { Colours { red: tc.red + c.colours.red, green: tc.green + c.colours.green, @@ -230,14 +230,14 @@ impl Player { } }); - for cryp in self.cryps.iter_mut() { - cryp.apply_modifiers(&player_colours); + for construct in self.constructs.iter_mut() { + construct.apply_modifiers(&player_colours); } Ok(self) } - pub fn vbox_unequip(&mut self, target: Item, cryp_id: Uuid) -> Result<&mut Player, Error> { + pub fn vbox_unequip(&mut self, target: Item, construct_id: Uuid) -> Result<&mut Player, Error> { if self.vbox.bound.len() >= 9 { return Err(err_msg("too many items bound")); } @@ -245,20 +245,20 @@ impl Player { match target.effect() { Some(ItemEffect::Skill) => { let skill = target.into_skill().ok_or(format_err!("item {:?} has no associated skill", target))?; - let cryp = self.cryp_get(cryp_id)?; - cryp.forget(skill)?; + let construct = self.construct_get(construct_id)?; + construct.forget(skill)?; }, Some(ItemEffect::Spec) => { let spec = target.into_spec().ok_or(format_err!("item {:?} has no associated spec", target))?; - let cryp = self.cryp_get(cryp_id)?; - cryp.spec_remove(spec)?; + let construct = self.construct_get(construct_id)?; + construct.spec_remove(spec)?; }, - None => return Err(err_msg("item has no effect on cryps")), + None => return Err(err_msg("item has no effect on constructs")), } // now the item has been applied // recalculate the stats of the whole player - let player_colours = self.cryps.iter().fold(Colours::new(), |tc, c| { + let player_colours = self.constructs.iter().fold(Colours::new(), |tc, c| { Colours { red: tc.red + c.colours.red, green: tc.green + c.colours.green, @@ -266,8 +266,8 @@ impl Player { } }); - for cryp in self.cryps.iter_mut() { - cryp.apply_modifiers(&player_colours); + for construct in self.constructs.iter_mut() { + construct.apply_modifiers(&player_colours); } self.vbox.bound.push(target); @@ -278,27 +278,27 @@ impl Player { // GAME METHODS pub fn skills_required(&self) -> usize { - let required = self.cryps.iter() + let required = self.constructs.iter() .filter(|c| !c.is_ko()) .filter(|c| c.available_skills().len() > 0) - .collect::>().len(); + .collect::>().len(); // info!("{:} requires {:} skills this turn", self.id, required); return required; } - pub fn taunting(&self) -> Option<&Cryp> { - self.cryps.iter() + pub fn taunting(&self) -> Option<&Construct> { + self.constructs.iter() .find(|c| c.affected(Effect::Taunt)) } - pub fn set_cryps(&mut self, mut cryps: Vec) -> &mut Player { - cryps.sort_unstable_by_key(|c| c.id); - self.cryps = cryps; + pub fn set_constructs(&mut self, mut constructs: Vec) -> &mut Player { + constructs.sort_unstable_by_key(|c| c.id); + self.constructs = constructs; self } - pub fn cryp_by_id(&mut self, id: Uuid) -> Option<&mut Cryp> { - self.cryps.iter_mut().find(|c| c.id == id) + pub fn construct_by_id(&mut self, id: Uuid) -> Option<&mut Construct> { + self.constructs.iter_mut().find(|c| c.id == id) } } @@ -320,7 +320,7 @@ pub fn player_get(tx: &mut Transaction, account_id: Uuid, instance_id: Uuid) -> None => return Err(err_msg("player not found")), }; - // tells from_slice to cast into a cryp + // tells from_slice to cast into a construct let bytes: Vec = returned.get("data"); let data = from_slice::(&bytes)?; @@ -386,24 +386,24 @@ pub fn player_delete(tx: &mut Transaction, id: Uuid) -> Result<(), Error> { return Ok(()); } -pub fn player_mm_cryps_set(params: PlayerCrypsSetParams, tx: &mut Transaction, account: &Account) -> Result { - if params.cryp_ids.len() != 3 { +pub fn player_mm_constructs_set(params: PlayerConstructsSetParams, tx: &mut Transaction, account: &Account) -> Result { + if params.construct_ids.len() != 3 { return Err(err_msg("player size is 3")); } - let cryps = params.cryp_ids + let constructs = params.construct_ids .iter() - .map(|id| cryp_get(tx, *id, account.id)) - .collect::, Error>>()?; + .map(|id| construct_get(tx, *id, account.id)) + .collect::, Error>>()?; let player = match player_get(tx, account.id, Uuid::nil()) { Ok(mut p) => { - p.cryps = cryps; + p.constructs = constructs; p.vbox = Vbox::new(); player_global_update(tx, p, false)? }, Err(_) => { - player_create(tx, Player::new(account.id, &account.name, cryps), Uuid::nil(), &account)? + player_create(tx, Player::new(account.id, &account.name, constructs), Uuid::nil(), &account)? } }; @@ -419,12 +419,12 @@ mod tests { #[test] fn player_bot_vbox_test() { let player_account = Uuid::new_v4(); - let cryps = instance_mobs(player_account); - let mut player = Player::new(player_account, &"test".to_string(), cryps).set_bot(true); + let constructs = instance_mobs(player_account); + let mut player = Player::new(player_account, &"test".to_string(), constructs).set_bot(true); player.vbox.fill(); player.autobuy(); - assert!(player.cryps.iter().all(|c| c.skills.len() >= 1)); + assert!(player.constructs.iter().all(|c| c.skills.len() >= 1)); } } \ No newline at end of file diff --git a/server/src/rpc.rs b/server/src/rpc.rs index 6b38c53a..464ff017 100644 --- a/server/src/rpc.rs +++ b/server/src/rpc.rs @@ -16,12 +16,12 @@ use failure::Error; use failure::err_msg; use net::Db; -use cryp::{Cryp, cryp_spawn}; +use construct::{Construct, construct_spawn}; use game::{Game, game_state, game_skill, game_ready}; -use account::{Account, account_create, account_login, account_from_token, account_cryps, account_instances}; +use account::{Account, account_create, account_login, account_from_token, account_constructs, account_instances}; use skill::{Skill}; use spec::{Spec}; -use player::{Score, player_mm_cryps_set}; +use player::{Score, player_mm_constructs_set}; use instance::{Instance, instance_state, instance_new, instance_ready, instance_join}; use vbox::{vbox_accept, vbox_apply, vbox_discard, vbox_combine, vbox_reclaim, vbox_unequip}; use item::{Item, ItemInfoCtr, item_info}; @@ -71,11 +71,11 @@ impl Rpc { "account_login" => Rpc::account_login(data, &mut tx, client), // auth methods - "account_cryps" => Rpc::account_cryps(data, &mut tx, account.unwrap(), client), + "account_constructs" => Rpc::account_constructs(data, &mut tx, account.unwrap(), client), "account_instances" => Rpc::account_instances(data, &mut tx, account.unwrap(), client), // "account_zone" => Rpc::account_zone(data, &mut tx, account.unwrap(), client), - "cryp_spawn" => Rpc::cryp_spawn(data, &mut tx, account.unwrap(), client), + "construct_spawn" => Rpc::construct_spawn(data, &mut tx, account.unwrap(), client), "game_state" => Rpc::game_state(data, &mut tx, account.unwrap(), client), "game_skill" => Rpc::game_skill(data, &mut tx, account.unwrap(), client), @@ -86,7 +86,7 @@ impl Rpc { "instance_new" => Rpc::instance_new(data, &mut tx, account.unwrap(), client), "instance_state" => Rpc::instance_state(data, &mut tx, account.unwrap(), client), - "player_mm_cryps_set" => Rpc::player_mm_cryps_set(data, &mut tx, account.unwrap(), client), + "player_mm_constructs_set" => Rpc::player_mm_constructs_set(data, &mut tx, account.unwrap(), client), "player_vbox_accept" => Rpc::player_vbox_accept(data, &mut tx, account.unwrap(), client), "player_vbox_apply" => Rpc::player_vbox_apply(data, &mut tx, account.unwrap(), client), "player_vbox_combine" => Rpc::player_vbox_combine(data, &mut tx, account.unwrap(), client), @@ -165,20 +165,20 @@ impl Rpc { } - fn cryp_spawn(data: Vec, tx: &mut Transaction, account: Account, client: &mut WebSocket) -> Result { - let msg = from_slice::(&data).or(Err(err_msg("invalid params")))?; + fn construct_spawn(data: Vec, tx: &mut Transaction, account: Account, client: &mut WebSocket) -> Result { + let msg = from_slice::(&data).or(Err(err_msg("invalid params")))?; Rpc::send_msg(client, RpcResponse { - method: "cryp_spawn".to_string(), - params: RpcResult::CrypSpawn(cryp_spawn(msg.params, tx, &account)?) + method: "construct_spawn".to_string(), + params: RpcResult::ConstructSpawn(construct_spawn(msg.params, tx, &account)?) })?; - let cryp_list = RpcResponse { - method: "account_cryps".to_string(), - params: RpcResult::CrypList(account_cryps(tx, &account)?) + let construct_list = RpcResponse { + method: "account_constructs".to_string(), + params: RpcResult::ConstructList(account_constructs(tx, &account)?) }; - Ok(cryp_list) + Ok(construct_list) } fn account_create(data: Vec, tx: &mut Transaction, _client: &mut WebSocket) -> Result { @@ -210,13 +210,13 @@ impl Rpc { // 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(); - // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // construct_spawn(ConstructSpawnParams { name }, tx, &account)?; // let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); - // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // construct_spawn(ConstructSpawnParams { name }, tx, &account)?; // let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(8).collect(); - // cryp_spawn(CrypSpawnParams { name }, tx, &account)?; + // construct_spawn(ConstructSpawnParams { name }, tx, &account)?; // let res = RpcResponse { // method: "account_create".to_string(), @@ -227,10 +227,10 @@ impl Rpc { // } - fn account_cryps(_data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { + fn account_constructs(_data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { Ok(RpcResponse { - method: "account_cryps".to_string(), - params: RpcResult::CrypList(account_cryps(tx, &account)?) + method: "account_constructs".to_string(), + params: RpcResult::ConstructList(account_constructs(tx, &account)?) }) } @@ -300,12 +300,12 @@ impl Rpc { } } - fn player_mm_cryps_set(data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { - let msg = from_slice::(&data).or(Err(err_msg("invalid params")))?; + fn player_mm_constructs_set(data: Vec, tx: &mut Transaction, account: Account, _client: &mut WebSocket) -> Result { + let msg = from_slice::(&data).or(Err(err_msg("invalid params")))?; let response = RpcResponse { method: "instance_state".to_string(), - params: RpcResult::InstanceState(player_mm_cryps_set(msg.params, tx, &account)?) + params: RpcResult::InstanceState(player_mm_constructs_set(msg.params, tx, &account)?) }; return Ok(response); @@ -354,8 +354,8 @@ impl Rpc { }; Rpc::send_msg(client, RpcResponse { - method: "account_cryps".to_string(), - params: RpcResult::CrypList(account_cryps(tx, &account)?) + method: "account_constructs".to_string(), + params: RpcResult::ConstructList(account_constructs(tx, &account)?) })?; return Ok(response); @@ -381,8 +381,8 @@ impl Rpc { }; Rpc::send_msg(client, RpcResponse { - method: "account_cryps".to_string(), - params: RpcResult::CrypList(account_cryps(tx, &account)?) + method: "account_constructs".to_string(), + params: RpcResult::ConstructList(account_constructs(tx, &account)?) })?; return Ok(response); @@ -397,12 +397,12 @@ pub struct RpcResponse { #[derive(Debug,Clone,Serialize,Deserialize)] pub enum RpcResult { - CrypSpawn(Cryp), - CrypForget(Cryp), - CrypLearn(Cryp), - CrypUnspec(Cryp), + ConstructSpawn(Construct), + ConstructForget(Construct), + ConstructLearn(Construct), + ConstructUnspec(Construct), Account(Account), - CrypList(Vec), + ConstructList(Vec), GameState(Game), ItemInfo(ItemInfoCtr), InstanceScores(Vec<(String, Score)>), @@ -422,50 +422,50 @@ pub struct RpcMessage { } #[derive(Debug,Clone,Serialize,Deserialize)] -struct CrypSpawnMsg { +struct ConstructSpawnMsg { method: String, - params: CrypSpawnParams, + params: ConstructSpawnParams, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct CrypSpawnParams { +pub struct ConstructSpawnParams { pub name: String, } #[derive(Debug,Clone,Serialize,Deserialize)] -struct CrypLearnMsg { +struct ConstructLearnMsg { method: String, - params: CrypLearnParams, + params: ConstructLearnParams, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct CrypLearnParams { +pub struct ConstructLearnParams { pub id: Uuid, pub skill: Skill, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct CrypForgetParams { +pub struct ConstructForgetParams { pub id: Uuid, pub skill: Skill, } #[derive(Debug,Clone,Serialize,Deserialize)] -struct CrypForgetMsg { +struct ConstructForgetMsg { method: String, - params: CrypForgetParams, + params: ConstructForgetParams, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct CrypUnspecParams { +pub struct ConstructUnspecParams { pub id: Uuid, pub spec: Spec, } #[derive(Debug,Clone,Serialize,Deserialize)] -struct CrypUnspecMsg { +struct ConstructUnspecMsg { method: String, - params: CrypUnspecParams, + params: ConstructUnspecParams, } #[derive(Debug,Clone,Serialize,Deserialize)] @@ -487,7 +487,7 @@ pub struct GameStateParams { // #[derive(Debug,Clone,Serialize,Deserialize)] // pub struct GamePveParams { -// pub cryp_ids: Vec, +// pub construct_ids: Vec, // } #[derive(Debug,Clone,Serialize,Deserialize)] @@ -499,8 +499,8 @@ struct GameSkillMsg { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct GameSkillParams { pub game_id: Uuid, - pub cryp_id: Uuid, - pub target_cryp_id: Option, + pub construct_id: Uuid, + pub target_construct_id: Option, pub skill: Skill, } @@ -529,7 +529,7 @@ pub struct AccountLoginParams { } #[derive(Debug,Clone,Serialize,Deserialize)] -struct AccountCrypsMsg { +struct AccountConstructsMsg { method: String, params: (), } @@ -542,7 +542,7 @@ struct InstanceLobbyMsg { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct InstanceLobbyParams { - pub cryp_ids: Vec, + pub construct_ids: Vec, pub name: String, pub players: usize, pub password: Option, @@ -557,7 +557,7 @@ struct InstanceJoinMsg { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct InstanceJoinParams { pub instance_id: Uuid, - pub cryp_ids: Vec, + pub construct_ids: Vec, } #[derive(Debug,Clone,Serialize,Deserialize)] @@ -583,14 +583,14 @@ pub struct InstanceStateParams { } #[derive(Debug,Clone,Serialize,Deserialize)] -struct PlayerCrypsSetMsg { +struct PlayerConstructsSetMsg { method: String, - params: PlayerCrypsSetParams, + params: PlayerConstructsSetParams, } #[derive(Debug,Clone,Serialize,Deserialize)] -pub struct PlayerCrypsSetParams { - pub cryp_ids: Vec, +pub struct PlayerConstructsSetParams { + pub construct_ids: Vec, } #[derive(Debug,Clone,Serialize,Deserialize)] @@ -638,7 +638,7 @@ struct VboxApplyMsg { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct VboxApplyParams { pub instance_id: Uuid, - pub cryp_id: Uuid, + pub construct_id: Uuid, pub index: usize, } @@ -651,7 +651,7 @@ struct VboxUnequipMsg { #[derive(Debug,Clone,Serialize,Deserialize)] pub struct VboxUnequipParams { pub instance_id: Uuid, - pub cryp_id: Uuid, + pub construct_id: Uuid, pub target: Item, } @@ -674,7 +674,7 @@ pub struct VboxReclaimParams { // #[test] // fn rpc_parse() { // let rpc = Rpc {}; -// let msg = GenerateMsg { method: "cryp_generate".to_string(), params: GenerateParams { level: 64 } }; +// let msg = GenerateMsg { method: "construct_generate".to_string(), params: GenerateParams { level: 64 } }; // let v = to_vec(&msg).unwrap(); // let received = rpc.receive(Message::Binary(v)); // } diff --git a/server/src/skill.rs b/server/src/skill.rs index 6d917f89..d4cf3c02 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -2,7 +2,7 @@ use rand::{thread_rng, Rng}; use uuid::Uuid; use util::{IntPct}; -use cryp::{Cryp, CrypEffect, EffectMeta, Stat}; +use construct::{Construct, ConstructEffect, EffectMeta, Stat}; use item::{Item}; use game::{Game}; @@ -17,19 +17,19 @@ pub fn resolution_steps(cast: &Cast, game: &mut Game) -> Resolutions { pub fn pre_resolve(cast: &Cast, game: &mut Game, mut resolutions: Resolutions) -> Resolutions { let skill = cast.skill; - let source = game.cryp_by_id(cast.source_cryp_id).unwrap().clone(); - let targets = game.get_targets(cast.skill, &source, cast.target_cryp_id); + let source = game.construct_by_id(cast.source_construct_id).unwrap().clone(); + let targets = game.get_targets(cast.skill, &source, cast.target_construct_id); if skill.aoe() { // Send an aoe skill event for anims - resolutions.push(Resolution::new(&source, &game.cryp_by_id(cast.target_cryp_id).unwrap().clone()).event(Event::AoeSkill { skill })); + resolutions.push(Resolution::new(&source, &game.construct_by_id(cast.target_construct_id).unwrap().clone()).event(Event::AoeSkill { skill })); } for target_id in targets { // we clone the current state of the target and source // so we can modify them during the resolution // no more than 1 mutable ref allowed on game - let mut source = game.cryp_by_id(cast.source_cryp_id).unwrap().clone(); - let mut target = game.cryp_by_id(target_id).unwrap().clone(); + let mut source = game.construct_by_id(cast.source_construct_id).unwrap().clone(); + let mut target = game.construct_by_id(target_id).unwrap().clone(); // bail out on ticks that have been removed if skill.is_tick() && target.effects.iter().find(|ce| match ce.tick { @@ -42,8 +42,8 @@ pub fn pre_resolve(cast: &Cast, game: &mut Game, mut resolutions: Resolutions) - resolutions = resolve(cast.skill, &mut source, &mut target, resolutions); // save the changes to the game - game.update_cryp(&mut source); - game.update_cryp(&mut target); + game.update_construct(&mut source); + game.update_construct(&mut target); // do additional steps resolutions = post_resolve(cast.skill, game, resolutions); @@ -52,7 +52,7 @@ pub fn pre_resolve(cast: &Cast, game: &mut Game, mut resolutions: Resolutions) - return resolutions; } -pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutions: Vec) -> Resolutions { +pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut resolutions: Vec) -> Resolutions { if let Some(disable) = source.disabled(skill) { resolutions.push(Resolution::new(source, target).event(Event::Disable { disable, skill })); return resolutions; @@ -179,8 +179,8 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> Resolutions { for Resolution { source, target, event } in resolutions.clone() { - let mut source = game.cryp_by_id(source.id).unwrap().clone(); - let mut target = game.cryp_by_id(target.id).unwrap().clone(); + let mut source = game.construct_by_id(source.id).unwrap().clone(); + let mut target = game.construct_by_id(target.id).unwrap().clone(); match event { Event::Damage { amount, skill, mitigation: _, colour: _ } => { @@ -208,8 +208,8 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> _ => (), }; - game.update_cryp(&mut source); - game.update_cryp(&mut target); + game.update_construct(&mut source); + game.update_construct(&mut target); }; return resolutions; @@ -221,30 +221,30 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> pub struct Cast { pub id: Uuid, pub source_player_id: Uuid, - pub source_cryp_id: Uuid, - pub target_cryp_id: Uuid, + pub source_construct_id: Uuid, + pub target_construct_id: Uuid, pub skill: Skill, pub speed: u64, } impl Cast { - pub fn new(source_cryp_id: Uuid, source_player_id: Uuid, target_cryp_id: Uuid, skill: Skill) -> Cast { + pub fn new(source_construct_id: Uuid, source_player_id: Uuid, target_construct_id: Uuid, skill: Skill) -> Cast { return Cast { id: Uuid::new_v4(), - source_cryp_id, + source_construct_id, source_player_id, - target_cryp_id, + target_construct_id, skill, speed: 0, }; } - pub fn new_tick(source: &mut Cryp, target: &mut Cryp, skill: Skill) -> Cast { + pub fn new_tick(source: &mut Construct, target: &mut Construct, skill: Skill) -> Cast { Cast { id: Uuid::new_v4(), - source_cryp_id: source.id, + source_construct_id: source.id, source_player_id: source.account, - target_cryp_id: target.id, + target_construct_id: target.id, skill, speed: 0, } @@ -259,23 +259,23 @@ pub type Disable = Vec; pub type Immunity = Vec; #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] -pub struct LogCryp { +pub struct LogConstruct { pub id: Uuid, pub name: String, } #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] pub struct Resolution { - pub source: LogCryp, - pub target: LogCryp, + pub source: LogConstruct, + pub target: LogConstruct, pub event: Event, } impl Resolution { - fn new(source: &Cryp, target: &Cryp) -> Resolution { + fn new(source: &Construct, target: &Construct) -> Resolution { Resolution { - source: LogCryp { id: source.id, name: source.name.clone() }, - target: LogCryp { id: target.id, name: target.name.clone() }, + source: LogConstruct { id: source.id, name: source.name.clone() }, + target: LogConstruct { id: target.id, name: target.name.clone() }, event: Event::Incomplete, } } @@ -641,49 +641,49 @@ impl Skill { } } - pub fn effect(&self) -> Vec { + pub fn effect(&self) -> Vec { match self { // Modifiers - Skill::Amplify => vec![CrypEffect {effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], - Skill::Banish => vec![CrypEffect {effect: Effect::Banish, duration: 1, meta: None, tick: None}], - Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(50)), tick: None}], - Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, meta: Some(EffectMeta::Multiplier(125)), tick: None }], - - Skill::Corrupt => vec![CrypEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, - CrypEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}], - - Skill::Clutch => vec![CrypEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], - Skill::Curse => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], - Skill::Debuff => vec![CrypEffect {effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }], - Skill::Decay => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, - CrypEffect {effect: Effect::Decay, duration: 3, meta: None, tick: None }], - Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }], - Skill::Hex => vec![CrypEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}], - Skill::Hostility => vec![CrypEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None}, - CrypEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], - Skill::Impurity => vec![CrypEffect {effect: Effect::Impurity, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }], - Skill::Invert => vec![CrypEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}], + Skill::Amplify => vec![ConstructEffect {effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::Banish => vec![ConstructEffect {effect: Effect::Banish, duration: 1, meta: None, tick: None}], + Skill::Block => vec![ConstructEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(50)), tick: None}], + Skill::Buff => vec![ConstructEffect {effect: Effect::Buff, duration: 2, meta: Some(EffectMeta::Multiplier(125)), tick: None }], - Skill::Parry => vec![CrypEffect {effect: Effect::Parry, duration: 2, meta: None, tick: None }], - Skill::Reflect => vec![CrypEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }], - Skill::Throw => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, - CrypEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::Corrupt => vec![ConstructEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, + ConstructEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}], - Skill::Ruin => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], + Skill::Clutch => vec![ConstructEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], + Skill::Curse => vec![ConstructEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::Debuff => vec![ConstructEffect {effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }], + Skill::Decay => vec![ConstructEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, + ConstructEffect {effect: Effect::Decay, duration: 3, meta: None, tick: None }], + Skill::Haste => vec![ConstructEffect {effect: Effect::Haste, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }], + Skill::Hex => vec![ConstructEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}], + Skill::Hostility => vec![ConstructEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None}, + ConstructEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], + Skill::Impurity => vec![ConstructEffect {effect: Effect::Impurity, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }], + Skill::Invert => vec![ConstructEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}], + + Skill::Parry => vec![ConstructEffect {effect: Effect::Parry, duration: 2, meta: None, tick: None }], + Skill::Reflect => vec![ConstructEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }], + Skill::Throw => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, + ConstructEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + + Skill::Ruin => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], - Skill::Scatter => vec![CrypEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], - Skill::Silence => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], - Skill::Siphon => vec![CrypEffect {effect: Effect::Siphon, duration: 2, meta: None, tick: None}], - Skill::Sleep => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], - Skill::Snare => vec![CrypEffect {effect: Effect::Snare, duration: 2, meta: None, tick: None}], - Skill::Strangle => vec![CrypEffect {effect: Effect::Strangle, duration: 2, meta: None, tick: None}], - Skill::Stun => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], - Skill::Taunt => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], - Skill::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}], + Skill::Scatter => vec![ConstructEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], + Skill::Silence => vec![ConstructEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], + Skill::Siphon => vec![ConstructEffect {effect: Effect::Siphon, duration: 2, meta: None, tick: None}], + Skill::Sleep => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], + Skill::Snare => vec![ConstructEffect {effect: Effect::Snare, duration: 2, meta: None, tick: None}], + Skill::Strangle => vec![ConstructEffect {effect: Effect::Strangle, duration: 2, meta: None, tick: None}], + Skill::Stun => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], + Skill::Taunt => vec![ConstructEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], + Skill::Triage => vec![ConstructEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}], //Unused - Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], + Skill::Injure => vec![ConstructEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], _ => { panic!("{:?} no skill effect", self); @@ -876,7 +876,7 @@ impl Skill { } } -fn touch(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn touch(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { target.deal_red_damage(skill, 0) .into_iter() .for_each(|e| results.push(Resolution::new(source, target).event(e))); @@ -884,7 +884,7 @@ fn touch(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn attack(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn attack(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); target.deal_red_damage(skill, amount) .into_iter() @@ -893,7 +893,7 @@ fn attack(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn strike(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn strike(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); target.deal_red_damage(skill, amount) .into_iter() @@ -902,7 +902,7 @@ fn strike(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn injure(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn injure(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); target.deal_red_damage(skill, amount) .into_iter() @@ -910,21 +910,21 @@ fn injure(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); - + return results; } -fn stun(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn stun(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); - + return results; } -fn sleep(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn sleep(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); - + let amount = source.green_damage().pct(skill.multiplier()); target.deal_green_damage(skill, amount) .into_iter() @@ -933,13 +933,13 @@ fn sleep(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn clutch(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn clutch(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results; } -fn taunt(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn taunt(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let red_amount = source.red_damage().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.recharge(skill, red_amount, 0))); @@ -948,27 +948,27 @@ fn taunt(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn throw(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn throw(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results; } -fn strangle(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn strangle(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter().for_each(|e| { - let CrypEffect { effect: _, duration, meta: _, tick: _ } = e; + let ConstructEffect { effect: _, duration, meta: _, tick: _ } = e; let strangle = e.clone().set_tick(Cast::new_tick(source, target, Skill::StrangleTick)); results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle))); - let attacker_strangle = CrypEffect::new(Effect::Strangling, duration); + let attacker_strangle = ConstructEffect::new(Effect::Strangling, duration); results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle))); }); return strangle_tick(source, target, results, Skill::StrangleTick); } -fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn strangle_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); target.deal_red_damage(skill, amount) .into_iter() @@ -979,7 +979,7 @@ fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, let i = source.effects .iter() .position(|e| e.effect == Effect::Strangling) - .expect("no strangling on cryp"); + .expect("no strangling on construct"); source.effects.remove(i); results.push(Resolution::new(source, source).event(Event::Removal { effect: Effect::Strangling })); } @@ -987,19 +987,19 @@ fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, return results; } -fn block(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn block(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results; } -fn buff(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn buff(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results; } -fn parry(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn parry(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let red_amount = source.red_damage().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.recharge(skill, red_amount, 0))); @@ -1008,7 +1008,7 @@ fn parry(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn riposte(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn riposte(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); target.deal_red_damage(skill, amount) .into_iter() @@ -1017,7 +1017,7 @@ fn riposte(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill return results; } -fn snare(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn snare(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); @@ -1037,7 +1037,7 @@ fn snare(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn slay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn slay(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.red_damage().pct(skill.multiplier()); let slay_events = target.deal_red_damage(skill, amount); @@ -1057,7 +1057,7 @@ fn slay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: S return results; } -fn heal(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn heal(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.green_damage().pct(skill.multiplier()); target.deal_green_damage(skill, amount) .into_iter() @@ -1065,7 +1065,7 @@ fn heal(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: S return results; } -fn triage(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn triage(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter().for_each(|e| { let triage = e.clone().set_tick(Cast::new_tick(source, target, Skill::TriageTick)); results.push(Resolution::new(source, target).event(target.add_effect(skill, triage))); @@ -1074,7 +1074,7 @@ fn triage(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return triage_tick(source, target, results, Skill::TriageTick); } -fn triage_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn triage_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.green_damage().pct(skill.multiplier()); target.deal_green_damage(Skill::TriageTick, amount) .into_iter() @@ -1082,7 +1082,7 @@ fn triage_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, s return results; } -fn chaos(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn chaos(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let mut rng = thread_rng(); let b_rng: u64 = rng.gen_range(0, 30); let amount = source.blue_damage().pct(skill.multiplier() + b_rng); @@ -1097,7 +1097,7 @@ fn chaos(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn blast(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn blast(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.blue_damage().pct(skill.multiplier()); target.deal_blue_damage(skill, amount) .into_iter() @@ -1105,28 +1105,28 @@ fn blast(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn amplify(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn amplify(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn haste(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn haste(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn debuff(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn debuff(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { - +fn decay(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { + skill.effect().into_iter().for_each(|e| { - let CrypEffect { effect, duration: _, meta: _, tick: _ } = e; + let ConstructEffect { effect, duration: _, meta: _, tick: _ } = e; let apply_effect = match effect { Effect::Wither => e.clone(), Effect::Decay => e.clone().set_tick(Cast::new_tick(source, target, Skill::DecayTick)), @@ -1138,7 +1138,7 @@ fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return decay_tick(source, target, results, Skill::DecayTick); } -fn decay_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn decay_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.blue_damage().pct(skill.multiplier()); target.deal_blue_damage(skill, amount) .into_iter() @@ -1148,13 +1148,13 @@ fn decay_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, sk // corrupt is the buff effect // when attacked it runs corruption and applies a debuff -fn corrupt(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn corrupt(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let corrupt = skill.effect().first().unwrap().clone(); results.push(Resolution::new(source, target).event(target.add_effect(skill, corrupt))); return results;; } -fn corruption(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn corruption(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let corruption = skill.effect().last().unwrap().clone() .set_tick(Cast::new_tick(source, target, Skill::CorruptionTick)); @@ -1162,7 +1162,7 @@ fn corruption(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, sk return corruption_tick(source, target, results, Skill::CorruptionTick); } -fn corruption_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn corruption_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.blue_damage().pct(skill.multiplier()); target.deal_blue_damage(skill, amount) .into_iter() @@ -1170,26 +1170,26 @@ fn corruption_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolution return results; } -fn ruin(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn ruin(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn hex(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn hex(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn hostility(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn hostility(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let hostility = skill.effect().first().unwrap().clone(); results.push(Resolution::new(source, target).event(target.add_effect(skill, hostility))); return results;; } -fn hatred(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, reflect_skill: Skill, amount: u64, skill: Skill) -> Resolutions { +fn hatred(source: &mut Construct, target: &mut Construct, mut results: Resolutions, reflect_skill: Skill, amount: u64, skill: Skill) -> Resolutions { let hatred = skill.effect().last().unwrap().clone() .set_meta(EffectMeta::AddedDamage(amount)); @@ -1197,25 +1197,25 @@ fn hatred(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, reflec return results;; } -fn curse(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn curse(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn impurity(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn impurity(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn invert(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn invert(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results;; } -fn reflect(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn reflect(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); @@ -1225,7 +1225,7 @@ fn reflect(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill return results;; } -fn recharge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let red_amount = source.red_damage().pct(skill.multiplier()); let blue_amount = source.blue_damage().pct(skill.multiplier()); @@ -1233,7 +1233,7 @@ fn recharge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skil return results; } -fn siphon(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn siphon(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter().for_each(|e| { let siphon = e.clone().set_tick(Cast::new_tick(source, target, Skill::SiphonTick)); results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon))); @@ -1242,7 +1242,7 @@ fn siphon(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return siphon_tick(source, target, results, Skill::SiphonTick); } -fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn siphon_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.blue_damage().pct(skill.multiplier()); let siphon_events = target.deal_blue_damage(Skill::SiphonTick, amount); @@ -1262,7 +1262,7 @@ fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, s return results; } -fn scatter(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn scatter(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let blue_amount = source.blue_damage().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.recharge(skill, 0, blue_amount))); @@ -1274,13 +1274,13 @@ fn scatter(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill return results; } -fn scatter_hit(source: &Cryp, target: &Cryp, mut results: Resolutions, game: &mut Game, event: Event) -> Resolutions { +fn scatter_hit(source: &Construct, target: &Construct, mut results: Resolutions, game: &mut Game, event: Event) -> Resolutions { match event { Event::Damage { amount, skill, mitigation: _, colour } => { let scatter = target.effects.iter().find(|e| e.effect == Effect::Scatter).unwrap(); if let Some(EffectMeta::ScatterTarget(scatter_target_id)) = scatter.meta { - let mut scatter_target = game.cryp_by_id(scatter_target_id).unwrap(); + let mut scatter_target = game.construct_by_id(scatter_target_id).unwrap(); let res = match colour { Colour::Red => scatter_target.deal_red_damage(skill, amount), @@ -1300,7 +1300,7 @@ fn scatter_hit(source: &Cryp, target: &Cryp, mut results: Resolutions, game: &mu } } -fn silence(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn silence(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); @@ -1319,7 +1319,7 @@ fn silence(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill return results; } -fn purge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, _skill: Skill) -> Resolutions { +fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, _skill: Skill) -> Resolutions { while let Some(i) = target.effects .iter() .position(|ce| ce.effect.category() == EffectCategory::Buff) { @@ -1330,7 +1330,7 @@ fn purge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, _skill: return results; } -fn purify(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn purify(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { results.push(Resolution::new(source, target).event(Event::Skill { skill })); let amount = source.green_damage().pct(skill.multiplier()); while let Some(i) = target.effects @@ -1346,7 +1346,7 @@ fn purify(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: return results; } -fn banish(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { +fn banish(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { skill.effect().into_iter() .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); return results; @@ -1358,11 +1358,11 @@ mod tests { #[test] fn heal_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()) .learn(Skill::Heal); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()) .learn(Skill::Heal); @@ -1373,10 +1373,10 @@ mod tests { #[test] fn decay_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); decay(&mut x, &mut y, vec![], Skill::Decay); @@ -1390,10 +1390,10 @@ mod tests { #[test] fn block_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); // ensure it doesn't have 0 pd @@ -1414,10 +1414,10 @@ mod tests { #[test] fn clutch_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); x.red_damage.force(10000000000000); // multiplication of int max will cause overflow @@ -1444,10 +1444,10 @@ mod tests { #[test] fn injure_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); resolve(Skill::Injure, &mut x, &mut y, vec![]); @@ -1457,10 +1457,10 @@ mod tests { #[test] fn invert_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); // give red shield but reduce to 0 @@ -1496,10 +1496,10 @@ mod tests { #[test] fn reflect_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); reflect(&mut y.clone(), &mut y, vec![], Skill::Reflect); @@ -1525,10 +1525,10 @@ mod tests { #[test] fn siphon_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"camel".to_string()); x.green_life.reduce(512); @@ -1562,10 +1562,10 @@ mod tests { #[test] fn triage_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"pretaliation".to_string()); // ensure it doesn't have 0 sd @@ -1586,10 +1586,10 @@ mod tests { #[test] fn recharge_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); - let mut y = Cryp::new() + let mut y = Construct::new() .named(&"pretaliation".to_string()); y.red_life.force(50); @@ -1613,7 +1613,7 @@ mod tests { #[test] fn silence_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); silence(&mut x.clone(), &mut x, vec![], Skill::Silence); @@ -1623,7 +1623,7 @@ mod tests { #[test] fn amplify_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); x.blue_damage.force(50); @@ -1635,7 +1635,7 @@ mod tests { #[test] fn purify_test() { - let mut x = Cryp::new() + let mut x = Construct::new() .named(&"muji".to_string()); decay(&mut x.clone(), &mut x, vec![], Skill::Decay); diff --git a/server/src/spec.rs b/server/src/spec.rs index d1406908..c642dc1e 100644 --- a/server/src/spec.rs +++ b/server/src/spec.rs @@ -1,4 +1,4 @@ -use cryp::{Stat, Colours}; +use construct::{Stat, Colours}; use util::{IntPct}; #[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)] @@ -59,8 +59,8 @@ impl Spec { } } - pub fn apply(&self, modified: u64, base: u64, cryp_colours: &Colours, player_colours: &Colours) -> u64 { - let cryp_colour_total: u64 = (cryp_colours.red + cryp_colours.green + cryp_colours.blue) as u64; + pub fn apply(&self, modified: u64, base: u64, construct_colours: &Colours, player_colours: &Colours) -> u64 { + let construct_colour_total: u64 = (construct_colours.red + construct_colours.green + construct_colours.blue) as u64; match *self { // Upgrades to Damage Spec Spec::Damage => modified + base.pct(5), @@ -157,42 +157,42 @@ impl Spec { if player_colours.green >= 5 { mult += 15 }; if player_colours.green >= 10 { mult += 30 }; if player_colours.green >= 20 { mult += 45 }; - mult * cryp_colour_total + mult * construct_colour_total }, Spec::RedLifeI => modified + { let mut mult: u64 = 25; if player_colours.red >= 5 { mult += 15 }; if player_colours.red >= 10 { mult += 30 }; if player_colours.red >= 20 { mult += 45 }; - mult * cryp_colour_total + mult * construct_colour_total }, Spec::BlueLifeI => modified + { let mut mult: u64 = 25; if player_colours.blue >= 5 { mult += 15 }; if player_colours.blue >= 10 { mult += 30 }; if player_colours.blue >= 20 { mult += 45 }; - mult * cryp_colour_total + mult * construct_colour_total }, Spec::GRLI => modified + { let mut mult: u64 = 15; if player_colours.green >= 2 && player_colours.red >= 2 { mult += 10 }; if player_colours.green >= 5 && player_colours.red >= 5 { mult += 20 }; if player_colours.green >= 10 && player_colours.red >= 10 { mult += 40 }; - mult * cryp_colour_total + mult * construct_colour_total }, Spec::GBLI => modified + { let mut mult: u64 = 15; if player_colours.green >= 2 && player_colours.red >= 2 { mult += 10 }; if player_colours.green >= 5 && player_colours.red >= 5 { mult += 20 }; if player_colours.green >= 10 && player_colours.red >= 10 { mult += 40 }; - mult * cryp_colour_total + mult * construct_colour_total }, Spec::RBLI => modified + { let mut mult: u64 = 15; if player_colours.blue >= 2 && player_colours.red >= 2 { mult += 10 }; if player_colours.blue >= 5 && player_colours.red >= 5 { mult += 20 }; if player_colours.blue >= 10 && player_colours.red >= 10 { mult += 40 }; - mult * cryp_colour_total + mult * construct_colour_total }, } } diff --git a/server/src/vbox.rs b/server/src/vbox.rs index b3e61de6..f551859a 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -13,7 +13,7 @@ use failure::err_msg; use account::Account; use rpc::{VboxAcceptParams, VboxDiscardParams, VboxCombineParams, VboxApplyParams, VboxReclaimParams, VboxUnequipParams}; use instance::{Instance, instance_get, instance_update}; -use cryp::{Colours}; +use construct::{Colours}; use item::*; @@ -181,13 +181,13 @@ pub fn vbox_reclaim(params: VboxReclaimParams, tx: &mut Transaction, account: &A pub fn vbox_apply(params: VboxApplyParams, tx: &mut Transaction, account: &Account) -> Result { let instance = instance_get(tx, params.instance_id)? - .vbox_apply(account.id, params.index, params.cryp_id)?; + .vbox_apply(account.id, params.index, params.construct_id)?; return instance_update(tx, instance); } pub fn vbox_unequip(params: VboxUnequipParams, tx: &mut Transaction, account: &Account) -> Result { let instance = instance_get(tx, params.instance_id)? - .vbox_unequip(account.id, params.target, params.cryp_id)?; + .vbox_unequip(account.id, params.target, params.construct_id)?; return instance_update(tx, instance); } diff --git a/server/src/zone.rs b/server/src/zone.rs index 4851b49c..f824587f 100644 --- a/server/src/zone.rs +++ b/server/src/zone.rs @@ -101,7 +101,7 @@ pub fn zone_get(tx: &mut Transaction, id: Uuid) -> Result { None => return Err(err_msg("zone not found")), }; - // tells from_slice to cast into a cryp + // tells from_slice to cast into a construct let bytes: Vec = returned.get("data"); let zone = match from_slice::(&bytes) { Ok(z) => z, @@ -180,7 +180,7 @@ pub fn zone_join(params: ZoneJoinParams, tx: &mut Transaction, account: &Account "BOSS" => GameMode::Zone3v3HealerBoss, _ => return Err(err_msg("unknown zone tag")), }; - game = game_pve_new(params.cryp_ids, mode, tx, account)?; + game = game_pve_new(params.construct_ids, mode, tx, account)?; game.set_zone(zone.id, params.node_id); encounter.game_id = Some(game.id); From 6a20e72a6490ebf706a034436b9a8c764789dff2 Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 25 May 2019 15:30:26 +1000 Subject: [PATCH 12/18] rename files --- ....button.jsx => construct.spawn.button.jsx} | 0 ...tainer.js => construct.spawn.container.js} | 0 .../{game.cryp.jsx => game.construct.jsx} | 0 ...ance.cryps.jsx => instance.constructs.jsx} | 0 phaser-client/.eslintrc.js | 1504 ---------- phaser-client/.gitignore | 5 - phaser-client/assets/alakazam-f.png | Bin 11850 -> 0 bytes phaser-client/assets/alphabet.jpg | Bin 28171 -> 0 bytes phaser-client/assets/aztec.atlas.json | 444 --- phaser-client/assets/aztec.clean.png | Bin 441536 -> 0 bytes phaser-client/assets/aztec.jpg | Bin 191448 -> 0 bytes phaser-client/assets/c1.svg | 18 - phaser-client/assets/c2.svg | 20 - phaser-client/assets/c3.svg | 20 - .../assets/fonts/noway-regular-webfont.eot | Bin 32974 -> 0 bytes .../assets/fonts/noway-regular-webfont.svg | 2657 ----------------- .../assets/fonts/noway-regular-webfont.ttf | Bin 86820 -> 0 bytes .../assets/fonts/noway-regular-webfont.woff | Bin 41672 -> 0 bytes .../assets/fonts/noway-regular-webfont.woff2 | Bin 28772 -> 0 bytes phaser-client/assets/glyphs.jpg | Bin 56616 -> 0 bytes phaser-client/assets/magmar.png | Bin 9551 -> 0 bytes phaser-client/cryps.css | 24 - phaser-client/index.html | 16 - phaser-client/index.js | 4 - phaser-client/lib/fizzy-noise.js | 189 -- phaser-client/lib/fizzy-text.js | 220 -- phaser-client/package.json | 33 - phaser-client/src/events.js | 219 -- phaser-client/src/main.js | 17 - phaser-client/src/scenes/avatar.js | 13 - phaser-client/src/scenes/background.js | 166 - phaser-client/src/scenes/combat.animations.js | 250 -- phaser-client/src/scenes/combat.cryps.js | 239 -- phaser-client/src/scenes/combat.hitbox.js | 89 - phaser-client/src/scenes/combat.js | 138 - phaser-client/src/scenes/combat.log.js | 50 - .../src/scenes/combat.render.resolutions.js | 135 - phaser-client/src/scenes/combat.skills.js | 235 -- phaser-client/src/scenes/constants.js | 388 --- phaser-client/src/scenes/cryps.js | 77 - phaser-client/src/scenes/elements/box.js | 132 - .../src/scenes/elements/combat.statbar.js | 86 - phaser-client/src/scenes/elements/item.js | 56 - .../src/scenes/elements/outline.rotate.js | 73 - phaser-client/src/scenes/game.list.js | 53 - phaser-client/src/scenes/header.js | 27 - phaser-client/src/scenes/home.cryps.js | 142 - phaser-client/src/scenes/home.instances.js | 48 - phaser-client/src/scenes/home.js | 91 - phaser-client/src/scenes/home.navigation.js | 61 - phaser-client/src/scenes/home.news.js | 24 - phaser-client/src/scenes/home.rankings.js | 24 - phaser-client/src/scenes/home.shop.js | 24 - phaser-client/src/scenes/item.info.js | 78 - phaser-client/src/scenes/item.list.js | 323 -- phaser-client/src/scenes/menu.cryps.list.js | 137 - phaser-client/src/scenes/menu.js | 97 - phaser-client/src/scenes/menu.navigation.js | 50 - phaser-client/src/scenes/statsheet.js | 143 - phaser-client/src/scenes/zone.controls.js | 41 - phaser-client/src/scenes/zone.node.js | 31 - phaser-client/src/scenes/zones.js | 129 - phaser-client/src/socket.js | 335 --- phaser-client/src/tutorial.js | 135 - phaser-client/src/utils.js | 36 - server/src/{cryp.rs => construct.rs} | 0 66 files changed, 9546 deletions(-) rename client/src/components/{cryp.spawn.button.jsx => construct.spawn.button.jsx} (100%) rename client/src/components/{cryp.spawn.container.js => construct.spawn.container.js} (100%) rename client/src/components/{game.cryp.jsx => game.construct.jsx} (100%) rename client/src/components/{instance.cryps.jsx => instance.constructs.jsx} (100%) delete mode 100755 phaser-client/.eslintrc.js delete mode 100644 phaser-client/.gitignore delete mode 100644 phaser-client/assets/alakazam-f.png delete mode 100644 phaser-client/assets/alphabet.jpg delete mode 100644 phaser-client/assets/aztec.atlas.json delete mode 100644 phaser-client/assets/aztec.clean.png delete mode 100644 phaser-client/assets/aztec.jpg delete mode 100644 phaser-client/assets/c1.svg delete mode 100644 phaser-client/assets/c2.svg delete mode 100644 phaser-client/assets/c3.svg delete mode 100755 phaser-client/assets/fonts/noway-regular-webfont.eot delete mode 100755 phaser-client/assets/fonts/noway-regular-webfont.svg delete mode 100755 phaser-client/assets/fonts/noway-regular-webfont.ttf delete mode 100755 phaser-client/assets/fonts/noway-regular-webfont.woff delete mode 100755 phaser-client/assets/fonts/noway-regular-webfont.woff2 delete mode 100644 phaser-client/assets/glyphs.jpg delete mode 100644 phaser-client/assets/magmar.png delete mode 100644 phaser-client/cryps.css delete mode 100644 phaser-client/index.html delete mode 100644 phaser-client/index.js delete mode 100644 phaser-client/lib/fizzy-noise.js delete mode 100644 phaser-client/lib/fizzy-text.js delete mode 100644 phaser-client/package.json delete mode 100644 phaser-client/src/events.js delete mode 100644 phaser-client/src/main.js delete mode 100644 phaser-client/src/scenes/avatar.js delete mode 100644 phaser-client/src/scenes/background.js delete mode 100644 phaser-client/src/scenes/combat.animations.js delete mode 100644 phaser-client/src/scenes/combat.cryps.js delete mode 100644 phaser-client/src/scenes/combat.hitbox.js delete mode 100644 phaser-client/src/scenes/combat.js delete mode 100644 phaser-client/src/scenes/combat.log.js delete mode 100644 phaser-client/src/scenes/combat.render.resolutions.js delete mode 100644 phaser-client/src/scenes/combat.skills.js delete mode 100644 phaser-client/src/scenes/constants.js delete mode 100644 phaser-client/src/scenes/cryps.js delete mode 100644 phaser-client/src/scenes/elements/box.js delete mode 100644 phaser-client/src/scenes/elements/combat.statbar.js delete mode 100644 phaser-client/src/scenes/elements/item.js delete mode 100644 phaser-client/src/scenes/elements/outline.rotate.js delete mode 100644 phaser-client/src/scenes/game.list.js delete mode 100644 phaser-client/src/scenes/header.js delete mode 100644 phaser-client/src/scenes/home.cryps.js delete mode 100644 phaser-client/src/scenes/home.instances.js delete mode 100644 phaser-client/src/scenes/home.js delete mode 100644 phaser-client/src/scenes/home.navigation.js delete mode 100644 phaser-client/src/scenes/home.news.js delete mode 100644 phaser-client/src/scenes/home.rankings.js delete mode 100644 phaser-client/src/scenes/home.shop.js delete mode 100644 phaser-client/src/scenes/item.info.js delete mode 100644 phaser-client/src/scenes/item.list.js delete mode 100644 phaser-client/src/scenes/menu.cryps.list.js delete mode 100644 phaser-client/src/scenes/menu.js delete mode 100644 phaser-client/src/scenes/menu.navigation.js delete mode 100644 phaser-client/src/scenes/statsheet.js delete mode 100644 phaser-client/src/scenes/zone.controls.js delete mode 100644 phaser-client/src/scenes/zone.node.js delete mode 100644 phaser-client/src/scenes/zones.js delete mode 100644 phaser-client/src/socket.js delete mode 100644 phaser-client/src/tutorial.js delete mode 100644 phaser-client/src/utils.js rename server/src/{cryp.rs => construct.rs} (100%) diff --git a/client/src/components/cryp.spawn.button.jsx b/client/src/components/construct.spawn.button.jsx similarity index 100% rename from client/src/components/cryp.spawn.button.jsx rename to client/src/components/construct.spawn.button.jsx diff --git a/client/src/components/cryp.spawn.container.js b/client/src/components/construct.spawn.container.js similarity index 100% rename from client/src/components/cryp.spawn.container.js rename to client/src/components/construct.spawn.container.js diff --git a/client/src/components/game.cryp.jsx b/client/src/components/game.construct.jsx similarity index 100% rename from client/src/components/game.cryp.jsx rename to client/src/components/game.construct.jsx diff --git a/client/src/components/instance.cryps.jsx b/client/src/components/instance.constructs.jsx similarity index 100% rename from client/src/components/instance.cryps.jsx rename to client/src/components/instance.constructs.jsx diff --git a/phaser-client/.eslintrc.js b/phaser-client/.eslintrc.js deleted file mode 100755 index 2bb5ed38..00000000 --- a/phaser-client/.eslintrc.js +++ /dev/null @@ -1,1504 +0,0 @@ -module.exports = { - // extends: [ - // 'plugin:react/recommended', - // ], - env: { - browser: true, - node: true - }, - parserOptions: { - ecmaVersion: 6, - sourceType: 'module', - }, - plugins: [ - 'import' - ], - settings: { - // react: { - // pragma: "preact", - // version: "15.0", - // }, - 'import/resolver': { - node: { - extensions: ['.mjs', '.js', '.jsx', '.json'] - } - }, - 'import/extensions': [ - '.js', - '.mjs', - '.jsx', - ], - 'import/core-modules': [], - 'import/ignore': [ - 'node_modules', - '\\.(coffee|scss|css|less|hbs|svg|json)$', - ], - }, - rules: { - // prevents stupid complaints a la - // (req) { - // req.something = x; - // } - 'no-param-reassign': [2, { props: false }], - 'no-multi-spaces': [0], - 'max-len': ['error', 120], - 'import/no-extraneous-dependencies': [0], - 'prefer-arrow-callback': [0], - 'arrow-body-style': [0], - 'no-return-assign': [2, 'except-parens'], - 'no-console': [0], - // i like loops - 'no-plusplus': [0], - 'no-await-in-loop': [0], - 'indent': ['error', 4], - 'keyword-spacing': ['error'], - 'key-spacing': ['error'], - - // for preact - // "react/react-in-jsx-scope": [0], - // "react/jsx-indent": [2, 4], - // "react/jsx-uses-react": 1, - // "react/jsx-uses-vars": 1, - // "react/prefer-stateless-function": 1, - // "react/prop-types": 0, - - // airbnb copypasta - // enforces getter/setter pairs in objects - 'accessor-pairs': 'off', - - // enforces return statements in callbacks of array's methods - // https://eslint.org/docs/rules/array-callback-return - 'array-callback-return': ['error', { allowImplicit: true }], - - // treat var statements as if they were block scoped - 'block-scoped-var': 'error', - - // specify the maximum cyclomatic complexity allowed in a program - complexity: ['off', 11], - - // enforce that class methods use "this" - // https://eslint.org/docs/rules/class-methods-use-this - 'class-methods-use-this': ['error', { - exceptMethods: [], - }], - - // require return statements to either always or never specify values - 'consistent-return': 'error', - - // specify curly brace conventions for all control statements - curly: ['error', 'multi-line'], - - // require default case in switch statements - 'default-case': ['error', { commentPattern: '^no default$' }], - - // encourages use of dot notation whenever possible - 'dot-notation': ['error', { allowKeywords: true }], - - // enforces consistent newlines before or after dots - // https://eslint.org/docs/rules/dot-location - 'dot-location': ['error', 'property'], - - // require the use of === and !== - // https://eslint.org/docs/rules/eqeqeq - eqeqeq: ['error', 'always', { null: 'ignore' }], - - // make sure for-in loops have an if statement - 'guard-for-in': 'error', - - // enforce a maximum number of classes per file - // https://eslint.org/docs/rules/max-classes-per-file - // TODO: semver-major (eslint 5): enable - 'max-classes-per-file': ['off', 1], - - // disallow the use of alert, confirm, and prompt - 'no-alert': 'warn', - - // disallow use of arguments.caller or arguments.callee - 'no-caller': 'error', - - // disallow lexical declarations in case/default clauses - // https://eslint.org/docs/rules/no-case-declarations.html - 'no-case-declarations': 'error', - - // disallow division operators explicitly at beginning of regular expression - // https://eslint.org/docs/rules/no-div-regex - 'no-div-regex': 'off', - - // disallow else after a return in an if - // https://eslint.org/docs/rules/no-else-return - 'no-else-return': ['error', { allowElseIf: false }], - - // disallow empty functions, except for standalone funcs/arrows - // https://eslint.org/docs/rules/no-empty-function - 'no-empty-function': ['error', { - allow: [ - 'arrowFunctions', - 'functions', - 'methods', - ] - }], - - // disallow empty destructuring patterns - // https://eslint.org/docs/rules/no-empty-pattern - 'no-empty-pattern': 'error', - - // disallow comparisons to null without a type-checking operator - 'no-eq-null': 'off', - - // disallow use of eval() - 'no-eval': 'error', - - // disallow adding to native types - 'no-extend-native': 'error', - - // disallow unnecessary function binding - 'no-extra-bind': 'error', - - // disallow Unnecessary Labels - // https://eslint.org/docs/rules/no-extra-label - 'no-extra-label': 'error', - - // disallow fallthrough of case statements - 'no-fallthrough': 'error', - - // disallow the use of leading or trailing decimal points in numeric literals - 'no-floating-decimal': 'error', - - // disallow reassignments of native objects or read-only globals - // https://eslint.org/docs/rules/no-global-assign - 'no-global-assign': ['error', { exceptions: [] }], - // deprecated in favor of no-global-assign - 'no-native-reassign': 'off', - - // disallow implicit type conversions - // https://eslint.org/docs/rules/no-implicit-coercion - 'no-implicit-coercion': ['off', { - boolean: false, - number: true, - string: true, - allow: [], - }], - - // disallow var and named functions in global scope - // https://eslint.org/docs/rules/no-implicit-globals - 'no-implicit-globals': 'off', - - // disallow use of eval()-like methods - 'no-implied-eval': 'error', - - // disallow this keywords outside of classes or class-like objects - 'no-invalid-this': 'off', - - // disallow usage of __iterator__ property - 'no-iterator': 'error', - - // disallow use of labels for anything other then loops and switches - 'no-labels': ['error', { allowLoop: false, allowSwitch: false }], - - // disallow unnecessary nested blocks - 'no-lone-blocks': 'error', - - // disallow creation of functions within loops - 'no-loop-func': 'error', - - // disallow magic numbers - // https://eslint.org/docs/rules/no-magic-numbers - 'no-magic-numbers': ['off', { - ignore: [], - ignoreArrayIndexes: true, - enforceConst: true, - detectObjects: false, - }], - - // disallow use of multiple spaces - 'no-multi-spaces': ['error', { - ignoreEOLComments: false, - }], - - // disallow use of multiline strings - 'no-multi-str': 'error', - - // disallow use of new operator when not part of the assignment or comparison - 'no-new': 'error', - - // disallow use of new operator for Function object - 'no-new-func': 'error', - - // disallows creating new instances of String, Number, and Boolean - 'no-new-wrappers': 'error', - - // disallow use of (old style) octal literals - 'no-octal': 'error', - - // disallow use of octal escape sequences in string literals, such as - // var foo = 'Copyright \251'; - 'no-octal-escape': 'error', - - // disallow reassignment of function parameters - // disallow parameter object manipulation except for specific exclusions - // rule: https://eslint.org/docs/rules/no-param-reassign.html - 'no-param-reassign': ['error', { - props: true, - ignorePropertyModificationsFor: [ - 'acc', // for reduce accumulators - 'accumulator', // for reduce accumulators - 'e', // for e.returnvalue - 'ctx', // for Koa routing - 'req', // for Express requests - 'request', // for Express requests - 'res', // for Express responses - 'response', // for Express responses - '$scope', // for Angular 1 scopes - ] - }], - - // disallow usage of __proto__ property - 'no-proto': 'error', - - // disallow declaring the same variable more then once - 'no-redeclare': 'error', - - // disallow certain object properties - // https://eslint.org/docs/rules/no-restricted-properties - 'no-restricted-properties': ['error', { - object: 'arguments', - property: 'callee', - message: 'arguments.callee is deprecated', - }, { - object: 'global', - property: 'isFinite', - message: 'Please use Number.isFinite instead', - }, { - object: 'self', - property: 'isFinite', - message: 'Please use Number.isFinite instead', - }, { - object: 'window', - property: 'isFinite', - message: 'Please use Number.isFinite instead', - }, { - object: 'global', - property: 'isNaN', - message: 'Please use Number.isNaN instead', - }, { - object: 'self', - property: 'isNaN', - message: 'Please use Number.isNaN instead', - }, { - object: 'window', - property: 'isNaN', - message: 'Please use Number.isNaN instead', - }, { - property: '__defineGetter__', - message: 'Please use Object.defineProperty instead.', - }, { - property: '__defineSetter__', - message: 'Please use Object.defineProperty instead.', - }, { - object: 'Math', - property: 'pow', - message: 'Use the exponentiation operator (**) instead.', - }], - - // disallow use of assignment in return statement - 'no-return-assign': ['error', 'always'], - - // disallow redundant `return await` - 'no-return-await': 'error', - - // disallow use of `javascript:` urls. - 'no-script-url': 'error', - - // disallow self assignment - // https://eslint.org/docs/rules/no-self-assign - // TODO: semver-major: props -> true - 'no-self-assign': ['error', { - props: false, - }], - - // disallow comparisons where both sides are exactly the same - 'no-self-compare': 'error', - - // disallow use of comma operator - 'no-sequences': 'error', - - // restrict what can be thrown as an exception - 'no-throw-literal': 'error', - - // disallow unmodified conditions of loops - // https://eslint.org/docs/rules/no-unmodified-loop-condition - 'no-unmodified-loop-condition': 'off', - - // disallow usage of expressions in statement position - 'no-unused-expressions': ['error', { - allowShortCircuit: false, - allowTernary: false, - allowTaggedTemplates: false, - }], - - // disallow unused labels - // https://eslint.org/docs/rules/no-unused-labels - 'no-unused-labels': 'error', - - // disallow unnecessary .call() and .apply() - 'no-useless-call': 'off', - - // disallow useless string concatenation - // https://eslint.org/docs/rules/no-useless-concat - 'no-useless-concat': 'error', - - // disallow unnecessary string escaping - // https://eslint.org/docs/rules/no-useless-escape - 'no-useless-escape': 'error', - - // disallow redundant return; keywords - // https://eslint.org/docs/rules/no-useless-return - 'no-useless-return': 'error', - - // disallow use of void operator - // https://eslint.org/docs/rules/no-void - 'no-void': 'error', - - // disallow usage of configurable warning terms in comments: e.g. todo - 'no-warning-comments': ['off', { terms: ['todo', 'fixme', 'xxx'], location: 'start' }], - - // disallow use of the with statement - 'no-with': 'error', - - // require using Error objects as Promise rejection reasons - // https://eslint.org/docs/rules/prefer-promise-reject-errors - 'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }], - - // require use of the second argument for parseInt() - radix: 'error', - - // require `await` in `async function` (note: this is a horrible rule that should never be used) - // https://eslint.org/docs/rules/require-await - 'require-await': 'off', - - // Enforce the use of u flag on RegExp - // https://eslint.org/docs/rules/require-unicode-regexp - 'require-unicode-regexp': 'off', - - // requires to declare all vars on top of their containing scope - 'vars-on-top': 'error', - - // require immediate function invocation to be wrapped in parentheses - // https://eslint.org/docs/rules/wrap-iife.html - 'wrap-iife': ['error', 'outside', { functionPrototypeMethods: false }], - - // require or disallow Yoda conditions - yoda: 'error', - - // Enforce “for” loop update clause moving the counter in the right direction - // https://eslint.org/docs/rules/for-direction - 'for-direction': 'error', - - // Enforces that a return statement is present in property getters - // https://eslint.org/docs/rules/getter-return - 'getter-return': ['error', { allowImplicit: true }], - - // disallow using an async function as a Promise executor - // https://eslint.org/docs/rules/no-async-promise-executor - // TODO: enable, semver-major - 'no-async-promise-executor': 'off', - - // Disallow await inside of loops - // https://eslint.org/docs/rules/no-await-in-loop - 'no-await-in-loop': 'error', - - // Disallow comparisons to negative zero - // https://eslint.org/docs/rules/no-compare-neg-zero - 'no-compare-neg-zero': 'error', - - // disallow assignment in conditional expressions - 'no-cond-assign': ['error', 'always'], - - // disallow use of console - 'no-console': 'warn', - - // disallow use of constant expressions in conditions - 'no-constant-condition': 'warn', - - // disallow control characters in regular expressions - 'no-control-regex': 'error', - - // disallow use of debugger - 'no-debugger': 'error', - - // disallow duplicate arguments in functions - 'no-dupe-args': 'error', - - // disallow duplicate keys when creating object literals - 'no-dupe-keys': 'error', - - // disallow a duplicate case label. - 'no-duplicate-case': 'error', - - // disallow empty statements - 'no-empty': 'error', - - // disallow the use of empty character classes in regular expressions - 'no-empty-character-class': 'error', - - // disallow assigning to the exception in a catch block - 'no-ex-assign': 'error', - - // disallow double-negation boolean casts in a boolean context - // https://eslint.org/docs/rules/no-extra-boolean-cast - 'no-extra-boolean-cast': 'error', - - // disallow unnecessary parentheses - // https://eslint.org/docs/rules/no-extra-parens - 'no-extra-parens': ['off', 'all', { - conditionalAssign: true, - nestedBinaryExpressions: false, - returnAssign: false, - ignoreJSX: 'all', // delegate to eslint-plugin-react - enforceForArrowConditionals: false, - }], - - // disallow unnecessary semicolons - 'no-extra-semi': 'error', - - // disallow overwriting functions written as function declarations - 'no-func-assign': 'error', - - // disallow function or variable declarations in nested blocks - 'no-inner-declarations': 'error', - - // disallow invalid regular expression strings in the RegExp constructor - 'no-invalid-regexp': 'error', - - // disallow irregular whitespace outside of strings and comments - 'no-irregular-whitespace': 'error', - - // Disallow characters which are made with multiple code points in character class syntax - // https://eslint.org/docs/rules/no-misleading-character-class - // TODO: enable, semver-major - 'no-misleading-character-class': 'off', - - // disallow the use of object properties of the global object (Math and JSON) as functions - 'no-obj-calls': 'error', - - // disallow use of Object.prototypes builtins directly - // https://eslint.org/docs/rules/no-prototype-builtins - 'no-prototype-builtins': 'error', - - // disallow multiple spaces in a regular expression literal - 'no-regex-spaces': 'error', - - // disallow sparse arrays - 'no-sparse-arrays': 'error', - - // Disallow template literal placeholder syntax in regular strings - // https://eslint.org/docs/rules/no-template-curly-in-string - 'no-template-curly-in-string': 'error', - - // Avoid code that looks like two expressions but is actually one - // https://eslint.org/docs/rules/no-unexpected-multiline - 'no-unexpected-multiline': 'error', - - // disallow unreachable statements after a return, throw, continue, or break statement - 'no-unreachable': 'error', - - // disallow return/throw/break/continue inside finally blocks - // https://eslint.org/docs/rules/no-unsafe-finally - 'no-unsafe-finally': 'error', - - // disallow negating the left operand of relational operators - // https://eslint.org/docs/rules/no-unsafe-negation - 'no-unsafe-negation': 'error', - // disallow negation of the left operand of an in expression - // deprecated in favor of no-unsafe-negation - 'no-negated-in-lhs': 'off', - - // Disallow assignments that can lead to race conditions due to usage of await or yield - // https://eslint.org/docs/rules/require-atomic-updates - // TODO: enable, semver-major - 'require-atomic-updates': 'off', - - // disallow comparisons with the value NaN - 'use-isnan': 'error', - - // ensure JSDoc comments are valid - // https://eslint.org/docs/rules/valid-jsdoc - 'valid-jsdoc': 'off', - - // ensure that the results of typeof are compared against a valid string - // https://eslint.org/docs/rules/valid-typeof - 'valid-typeof': ['error', { requireStringLiterals: true }], - - // enforces no braces where they can be omitted - // https://eslint.org/docs/rules/arrow-body-style - // TODO: enable requireReturnForObjectLiteral? - 'arrow-body-style': ['error', 'as-needed', { - requireReturnForObjectLiteral: false, - }], - - // require parens in arrow function arguments - // https://eslint.org/docs/rules/arrow-parens - 'arrow-parens': ['error', 'as-needed', { - requireForBlockBody: true, - }], - - // require space before/after arrow function's arrow - // https://eslint.org/docs/rules/arrow-spacing - 'arrow-spacing': ['error', { before: true, after: true }], - - // verify super() callings in constructors - 'constructor-super': 'error', - - // enforce the spacing around the * in generator functions - // https://eslint.org/docs/rules/generator-star-spacing - 'generator-star-spacing': ['error', { before: false, after: true }], - - // disallow modifying variables of class declarations - // https://eslint.org/docs/rules/no-class-assign - 'no-class-assign': 'error', - - // disallow arrow functions where they could be confused with comparisons - // https://eslint.org/docs/rules/no-confusing-arrow - 'no-confusing-arrow': ['error', { - allowParens: true, - }], - - // disallow modifying variables that are declared using const - 'no-const-assign': 'error', - - // disallow duplicate class members - // https://eslint.org/docs/rules/no-dupe-class-members - 'no-dupe-class-members': 'error', - - // disallow importing from the same path more than once - // https://eslint.org/docs/rules/no-duplicate-imports - // replaced by https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md - 'no-duplicate-imports': 'off', - - // disallow symbol constructor - // https://eslint.org/docs/rules/no-new-symbol - 'no-new-symbol': 'error', - - // disallow specific imports - // https://eslint.org/docs/rules/no-restricted-imports - 'no-restricted-imports': ['off', { - paths: [], - patterns: [] - }], - - // disallow to use this/super before super() calling in constructors. - // https://eslint.org/docs/rules/no-this-before-super - 'no-this-before-super': 'error', - - // disallow useless computed property keys - // https://eslint.org/docs/rules/no-useless-computed-key - 'no-useless-computed-key': 'error', - - // disallow unnecessary constructor - // https://eslint.org/docs/rules/no-useless-constructor - 'no-useless-constructor': 'error', - - // disallow renaming import, export, and destructured assignments to the same name - // https://eslint.org/docs/rules/no-useless-rename - 'no-useless-rename': ['error', { - ignoreDestructuring: false, - ignoreImport: false, - ignoreExport: false, - }], - - // require let or const instead of var - 'no-var': 'error', - - // require method and property shorthand syntax for object literals - // https://eslint.org/docs/rules/object-shorthand - 'object-shorthand': ['error', 'always', { - ignoreConstructors: false, - avoidQuotes: true, - }], - - // // suggest using arrow functions as callbacks - // 'prefer-arrow-callback': ['error', { - // allowNamedFunctions: false, - // allowUnboundThis: true, - // }], - - // suggest using of const declaration for variables that are never modified after declared - 'prefer-const': ['error', { - destructuring: 'any', - ignoreReadBeforeAssign: true, - }], - - // Prefer destructuring from arrays and objects - // https://eslint.org/docs/rules/prefer-destructuring - 'prefer-destructuring': ['error', { - VariableDeclarator: { - array: false, - object: true, - }, - AssignmentExpression: { - array: true, - object: true, - }, - }, { - enforceForRenamedProperties: false, - }], - - // disallow parseInt() in favor of binary, octal, and hexadecimal literals - // https://eslint.org/docs/rules/prefer-numeric-literals - 'prefer-numeric-literals': 'error', - - // suggest using Reflect methods where applicable - // https://eslint.org/docs/rules/prefer-reflect - 'prefer-reflect': 'off', - - // use rest parameters instead of arguments - // https://eslint.org/docs/rules/prefer-rest-params - 'prefer-rest-params': 'error', - - // suggest using the spread operator instead of .apply() - // https://eslint.org/docs/rules/prefer-spread - 'prefer-spread': 'error', - - // suggest using template literals instead of string concatenation - // https://eslint.org/docs/rules/prefer-template - 'prefer-template': 'error', - - // disallow generator functions that do not have yield - // https://eslint.org/docs/rules/require-yield - 'require-yield': 'error', - - // enforce spacing between object rest-spread - // https://eslint.org/docs/rules/rest-spread-spacing - 'rest-spread-spacing': ['error', 'never'], - - // import sorting - // https://eslint.org/docs/rules/sort-imports - 'sort-imports': ['off', { - ignoreCase: false, - ignoreMemberSort: false, - memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], - }], - - // require a Symbol description - // https://eslint.org/docs/rules/symbol-description - 'symbol-description': 'error', - - // enforce usage of spacing in template strings - // https://eslint.org/docs/rules/template-curly-spacing - 'template-curly-spacing': 'error', - - // enforce spacing around the * in yield* expressions - // https://eslint.org/docs/rules/yield-star-spacing - 'yield-star-spacing': ['error', 'after'], - - // VARIABLES // - // enforce or disallow variable initializations at definition - 'init-declarations': 'off', - - // disallow the catch clause parameter name being the same as a variable in the outer scope - 'no-catch-shadow': 'off', - - // disallow deletion of variables - 'no-delete-var': 'error', - - // disallow labels that share a name with a variable - // https://eslint.org/docs/rules/no-label-var - 'no-label-var': 'error', - - // disallow specific globals - 'no-restricted-globals': ['error', 'isFinite', 'isNaN'], - - // disallow declaration of variables already declared in the outer scope - 'no-shadow': 'error', - - // disallow shadowing of names such as arguments - 'no-shadow-restricted-names': 'error', - - // disallow use of undeclared variables unless mentioned in a /*global */ block - 'no-undef': 'error', - - // disallow use of undefined when initializing variables - 'no-undef-init': 'error', - - // disallow use of undefined variable - // https://eslint.org/docs/rules/no-undefined - // TODO: enable? - 'no-undefined': 'off', - - // disallow declaration of variables that are not used in the code - 'no-unused-vars': ['error', { vars: 'all', args: 'after-used', ignoreRestSiblings: true }], - - // disallow use of variables before they are defined - 'no-use-before-define': ['error', { functions: true, classes: true, variables: true }], - - // STYLE // - - // enforce line breaks after opening and before closing array brackets - // https://eslint.org/docs/rules/array-bracket-newline - // TODO: enable? semver-major - 'array-bracket-newline': ['off', 'consistent'], // object option alternative: { multiline: true, minItems: 3 } - - // enforce line breaks between array elements - // https://eslint.org/docs/rules/array-element-newline - // TODO: enable? semver-major - 'array-element-newline': ['off', { multiline: true, minItems: 3 }], - - // enforce spacing inside array brackets - 'array-bracket-spacing': ['error', 'never'], - - // enforce spacing inside single-line blocks - // https://eslint.org/docs/rules/block-spacing - 'block-spacing': ['error', 'always'], - - // enforce one true brace style - 'brace-style': ['error', '1tbs', { allowSingleLine: true }], - - // require camel case names - // TODO: semver-major (eslint 5): add ignoreDestructuring: false option - camelcase: ['error', { properties: 'never' }], - - // enforce or disallow capitalization of the first letter of a comment - // https://eslint.org/docs/rules/capitalized-comments - 'capitalized-comments': ['off', 'never', { - line: { - ignorePattern: '.*', - ignoreInlineComments: true, - ignoreConsecutiveComments: true, - }, - block: { - ignorePattern: '.*', - ignoreInlineComments: true, - ignoreConsecutiveComments: true, - }, - }], - - // require trailing commas in multiline object literals - 'comma-dangle': ['error', { - arrays: 'always-multiline', - objects: 'always-multiline', - imports: 'always-multiline', - exports: 'always-multiline', - // functions: 'always-multiline', - }], - - // enforce spacing before and after comma - 'comma-spacing': ['error', { before: false, after: true }], - - // enforce one true comma style - 'comma-style': ['error', 'last', { - exceptions: { - ArrayExpression: false, - ArrayPattern: false, - ArrowFunctionExpression: false, - CallExpression: false, - FunctionDeclaration: false, - FunctionExpression: false, - ImportDeclaration: false, - ObjectExpression: false, - ObjectPattern: false, - VariableDeclaration: false, - NewExpression: false, - } - }], - - // disallow padding inside computed properties - 'computed-property-spacing': ['error', 'never'], - - // enforces consistent naming when capturing the current execution context - 'consistent-this': 'off', - - // enforce newline at the end of file, with no multiple empty lines - 'eol-last': ['error', 'always'], - - // enforce spacing between functions and their invocations - // https://eslint.org/docs/rules/func-call-spacing - 'func-call-spacing': ['error', 'never'], - - // requires function names to match the name of the variable or property to which they are - // assigned - // https://eslint.org/docs/rules/func-name-matching - // TODO: semver-major (eslint 5): add considerPropertyDescriptor: true - 'func-name-matching': ['off', 'always', { - includeCommonJSModuleExports: false - }], - - // require function expressions to have a name - // https://eslint.org/docs/rules/func-names - 'func-names': 'warn', - - // enforces use of function declarations or expressions - // https://eslint.org/docs/rules/func-style - // TODO: enable - 'func-style': ['off', 'expression'], - - // enforce consistent line breaks inside function parentheses - // https://eslint.org/docs/rules/function-paren-newline - 'function-paren-newline': ['error', 'consistent'], - - // Blacklist certain identifiers to prevent them being used - // https://eslint.org/docs/rules/id-blacklist - 'id-blacklist': 'off', - - // this option enforces minimum and maximum identifier lengths - // (variable names, property names etc.) - 'id-length': 'off', - - // require identifiers to match the provided regular expression - 'id-match': 'off', - - // Enforce the location of arrow function bodies with implicit returns - // https://eslint.org/docs/rules/implicit-arrow-linebreak - 'implicit-arrow-linebreak': ['error', 'beside'], - - // this option sets a specific tab width for your code - // https://eslint.org/docs/rules/indent - indent: ['error', 4, { - SwitchCase: 1, - VariableDeclarator: 1, - outerIIFEBody: 1, - // MemberExpression: null, - FunctionDeclaration: { - parameters: 1, - body: 1 - }, - FunctionExpression: { - parameters: 1, - body: 1 - }, - CallExpression: { - arguments: 1 - }, - ArrayExpression: 1, - ObjectExpression: 1, - ImportDeclaration: 1, - flatTernaryExpressions: false, - // list derived from https://github.com/benjamn/ast-types/blob/HEAD/def/jsx.js - ignoredNodes: ['JSXElement', 'JSXElement > *', 'JSXAttribute', 'JSXIdentifier', 'JSXNamespacedName', 'JSXMemberExpression', 'JSXSpreadAttribute', 'JSXExpressionContainer', 'JSXOpeningElement', 'JSXClosingElement', 'JSXText', 'JSXEmptyExpression', 'JSXSpreadChild'], - ignoreComments: false - }], - - // specify whether double or single quotes should be used in JSX attributes - // https://eslint.org/docs/rules/jsx-quotes - 'jsx-quotes': ['off', 'prefer-double'], - - // enforces spacing between keys and values in object literal properties - 'key-spacing': ['error', { beforeColon: false, afterColon: true }], - - // require a space before & after certain keywords - 'keyword-spacing': ['error', { - before: true, - after: true, - overrides: { - return: { after: true }, - throw: { after: true }, - case: { after: true } - } - }], - - // enforce position of line comments - // https://eslint.org/docs/rules/line-comment-position - // TODO: enable? - 'line-comment-position': ['off', { - position: 'above', - ignorePattern: '', - applyDefaultPatterns: true, - }], - - // disallow mixed 'LF' and 'CRLF' as linebreaks - // https://eslint.org/docs/rules/linebreak-style - 'linebreak-style': ['error', 'unix'], - - // require or disallow an empty line between class members - // https://eslint.org/docs/rules/lines-between-class-members - 'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: false }], - - // enforces empty lines around comments - 'lines-around-comment': 'off', - - // require or disallow newlines around directives - // https://eslint.org/docs/rules/lines-around-directive - 'lines-around-directive': ['error', { - before: 'always', - after: 'always', - }], - - // specify the maximum depth that blocks can be nested - 'max-depth': ['off', 4], - - // specify the maximum length of a line in your program - // https://eslint.org/docs/rules/max-len - 'max-len': ['error', 120, 2, { - ignoreUrls: true, - ignoreComments: false, - ignoreRegExpLiterals: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - }], - - // specify the max number of lines in a file - // https://eslint.org/docs/rules/max-lines - 'max-lines': ['off', { - max: 300, - skipBlankLines: true, - skipComments: true - }], - - // enforce a maximum function length - // https://eslint.org/docs/rules/max-lines-per-function - 'max-lines-per-function': ['off', { - max: 50, - skipBlankLines: true, - skipComments: true, - IIFEs: true, - }], - - // specify the maximum depth callbacks can be nested - 'max-nested-callbacks': 'off', - - // limits the number of parameters that can be used in the function declaration. - 'max-params': ['off', 3], - - // specify the maximum number of statement allowed in a function - 'max-statements': ['off', 10], - - // restrict the number of statements per line - // https://eslint.org/docs/rules/max-statements-per-line - 'max-statements-per-line': ['off', { max: 1 }], - - // enforce a particular style for multiline comments - // https://eslint.org/docs/rules/multiline-comment-style - 'multiline-comment-style': ['off', 'starred-block'], - - // require multiline ternary - // https://eslint.org/docs/rules/multiline-ternary - // TODO: enable? - 'multiline-ternary': ['off', 'never'], - - // require a capital letter for constructors - 'new-cap': ['error', { - newIsCap: true, - newIsCapExceptions: [], - capIsNew: false, - capIsNewExceptions: ['Immutable.Map', 'Immutable.Set', 'Immutable.List'], - }], - - // disallow the omission of parentheses when invoking a constructor with no arguments - // https://eslint.org/docs/rules/new-parens - 'new-parens': 'error', - - // allow/disallow an empty newline after var statement - 'newline-after-var': 'off', - - // https://eslint.org/docs/rules/newline-before-return - 'newline-before-return': 'off', - - // enforces new line after each method call in the chain to make it - // more readable and easy to maintain - // https://eslint.org/docs/rules/newline-per-chained-call - 'newline-per-chained-call': ['error', { ignoreChainWithDepth: 4 }], - - // disallow use of the Array constructor - 'no-array-constructor': 'error', - - // disallow use of bitwise operators - // https://eslint.org/docs/rules/no-bitwise - 'no-bitwise': 'error', - - // disallow use of the continue statement - // https://eslint.org/docs/rules/no-continue - 'no-continue': 'error', - - // disallow comments inline after code - 'no-inline-comments': 'off', - - // disallow if as the only statement in an else block - // https://eslint.org/docs/rules/no-lonely-if - 'no-lonely-if': 'error', - - // disallow un-paren'd mixes of different operators - // https://eslint.org/docs/rules/no-mixed-operators - 'no-mixed-operators': ['error', { - // the list of arthmetic groups disallows mixing `%` and `**` - // with other arithmetic operators. - groups: [ - ['%', '**'], - ['%', '+'], - ['%', '-'], - ['%', '*'], - ['%', '/'], - ['**', '+'], - ['**', '-'], - ['**', '*'], - ['**', '/'], - ['&', '|', '^', '~', '<<', '>>', '>>>'], - ['==', '!=', '===', '!==', '>', '>=', '<', '<='], - ['&&', '||'], - ['in', 'instanceof'] - ], - allowSamePrecedence: false - }], - - // disallow mixed spaces and tabs for indentation - 'no-mixed-spaces-and-tabs': 'error', - - // disallow use of chained assignment expressions - // https://eslint.org/docs/rules/no-multi-assign - 'no-multi-assign': ['error'], - - // disallow multiple empty lines and only one newline at the end - 'no-multiple-empty-lines': ['error', { max: 2, maxEOF: 0 }], - - // disallow negated conditions - // https://eslint.org/docs/rules/no-negated-condition - 'no-negated-condition': 'off', - - // disallow nested ternary expressions - 'no-nested-ternary': 'error', - - // disallow use of the Object constructor - 'no-new-object': 'error', - - // disallow use of unary operators, ++ and -- - // https://eslint.org/docs/rules/no-plusplus - 'no-plusplus': 'error', - - // disallow certain syntax forms - // https://eslint.org/docs/rules/no-restricted-syntax - 'no-restricted-syntax': [ - 'error', - { - selector: 'ForInStatement', - message: 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', - }, - { - selector: 'ForOfStatement', - message: 'iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.', - }, - { - selector: 'LabeledStatement', - message: 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', - }, - { - selector: 'WithStatement', - message: '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', - }, - ], - - // disallow space between function identifier and application - 'no-spaced-func': 'error', - - // disallow tab characters entirely - 'no-tabs': 'error', - - // disallow the use of ternary operators - 'no-ternary': 'off', - - // disallow trailing whitespace at the end of lines - 'no-trailing-spaces': ['error', { - skipBlankLines: false, - ignoreComments: false, - }], - - // disallow dangling underscores in identifiers - // https://eslint.org/docs/rules/no-underscore-dangle - 'no-underscore-dangle': ['error', { - allow: [], - allowAfterThis: false, - allowAfterSuper: false, - enforceInMethodNames: true, - }], - - // disallow the use of Boolean literals in conditional expressions - // also, prefer `a || b` over `a ? a : b` - // https://eslint.org/docs/rules/no-unneeded-ternary - 'no-unneeded-ternary': ['error', { defaultAssignment: false }], - - // disallow whitespace before properties - // https://eslint.org/docs/rules/no-whitespace-before-property - 'no-whitespace-before-property': 'error', - - // enforce the location of single-line statements - // https://eslint.org/docs/rules/nonblock-statement-body-position - 'nonblock-statement-body-position': ['error', 'beside', { overrides: {} }], - - // require padding inside curly braces - 'object-curly-spacing': ['error', 'always'], - - // enforce line breaks between braces - // https://eslint.org/docs/rules/object-curly-newline - 'object-curly-newline': ['error', { - ObjectExpression: { minProperties: 4, multiline: true, consistent: true }, - ObjectPattern: { minProperties: 4, multiline: true, consistent: true }, - ImportDeclaration: { minProperties: 4, multiline: true, consistent: true }, - ExportDeclaration: { minProperties: 4, multiline: true, consistent: true }, - }], - - // enforce "same line" or "multiple line" on object properties. - // https://eslint.org/docs/rules/object-property-newline - 'object-property-newline': ['error', { - allowAllPropertiesOnSameLine: true, - }], - - // allow just one var statement per function - 'one-var': ['error', 'never'], - - // require a newline around variable declaration - // https://eslint.org/docs/rules/one-var-declaration-per-line - 'one-var-declaration-per-line': ['error', 'always'], - - // require assignment operator shorthand where possible or prohibit it entirely - // https://eslint.org/docs/rules/operator-assignment - 'operator-assignment': ['error', 'always'], - - // Requires operator at the beginning of the line in multiline statements - // https://eslint.org/docs/rules/operator-linebreak - 'operator-linebreak': ['error', 'before', { overrides: { '=': 'none' } }], - - // disallow padding within blocks - 'padded-blocks': ['error', { blocks: 'never', classes: 'never', switches: 'never' }], - - // Require or disallow padding lines between statements - // https://eslint.org/docs/rules/padding-line-between-statements - 'padding-line-between-statements': 'off', - - // Prefer use of an object spread over Object.assign - // https://eslint.org/docs/rules/prefer-object-spread - // TODO: semver-major (eslint 5): enable - 'prefer-object-spread': 'off', - - // require quotes around object literal property names - // https://eslint.org/docs/rules/quote-props.html - 'quote-props': ['error', 'as-needed', { keywords: false, unnecessary: true, numbers: false }], - - // specify whether double or single quotes should be used - quotes: ['error', 'single', { avoidEscape: true }], - - // do not require jsdoc - // https://eslint.org/docs/rules/require-jsdoc - 'require-jsdoc': 'off', - - // require or disallow use of semicolons instead of ASI - semi: ['error', 'always'], - - // enforce spacing before and after semicolons - 'semi-spacing': ['error', { before: false, after: true }], - - // Enforce location of semicolons - // https://eslint.org/docs/rules/semi-style - 'semi-style': ['error', 'last'], - - // requires object keys to be sorted - 'sort-keys': ['off', 'asc', { caseSensitive: false, natural: true }], - - // sort variables within the same declaration block - 'sort-vars': 'off', - - // require or disallow space before blocks - 'space-before-blocks': 'error', - - // require or disallow space before function opening parenthesis - // https://eslint.org/docs/rules/space-before-function-paren - 'space-before-function-paren': ['error', { - anonymous: 'always', - named: 'never', - asyncArrow: 'always' - }], - - // require or disallow spaces inside parentheses - 'space-in-parens': ['error', 'never'], - - // require spaces around operators - 'space-infix-ops': 'error', - - // Require or disallow spaces before/after unary operators - // https://eslint.org/docs/rules/space-unary-ops - 'space-unary-ops': ['error', { - words: true, - nonwords: false, - overrides: { - }, - }], - - // require or disallow a space immediately following the // or /* in a comment - // https://eslint.org/docs/rules/spaced-comment - 'spaced-comment': ['error', 'always', { - line: { - exceptions: ['-', '+'], - markers: ['=', '!'], // space here to support sprockets directives - }, - block: { - exceptions: ['-', '+'], - markers: ['=', '!'], // space here to support sprockets directives - balanced: true, - } - }], - - // Enforce spacing around colons of switch statements - // https://eslint.org/docs/rules/switch-colon-spacing - 'switch-colon-spacing': ['error', { after: true, before: false }], - - // Require or disallow spacing between template tags and their literals - // https://eslint.org/docs/rules/template-tag-spacing - 'template-tag-spacing': ['error', 'never'], - - // require or disallow the Unicode Byte Order Mark - // https://eslint.org/docs/rules/unicode-bom - 'unicode-bom': ['error', 'never'], - - // require regex literals to be wrapped in parentheses - 'wrap-regex': 'off', - - // NODE // - // enforce return after a callback - 'callback-return': 'off', - - // require all requires be top-level - // https://eslint.org/docs/rules/global-require - 'global-require': 'error', - - // enforces error handling in callbacks (node environment) - 'handle-callback-err': 'off', - - // disallow use of the Buffer() constructor - // https://eslint.org/docs/rules/no-buffer-constructor - 'no-buffer-constructor': 'error', - - // disallow mixing regular variable and require declarations - 'no-mixed-requires': ['off', false], - - // disallow use of new operator with the require function - 'no-new-require': 'error', - - // disallow string concatenation with __dirname and __filename - // https://eslint.org/docs/rules/no-path-concat - 'no-path-concat': 'error', - - // disallow use of process.env - 'no-process-env': 'off', - - // disallow process.exit() - 'no-process-exit': 'off', - - // restrict usage of specified node modules - 'no-restricted-modules': 'off', - - // disallow use of synchronous methods (off by default) - 'no-sync': 'off', - - // IMPORT // - // Static analysis: - - // ensure imports point to files/modules that can be resolved - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md - 'import/no-unresolved': ['error', { commonjs: true, caseSensitive: true }], - - // ensure named imports coupled with named exports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/named.md#when-not-to-use-it - 'import/named': 'error', - - // ensure default import coupled with default export - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/default.md#when-not-to-use-it - 'import/default': 'off', - - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/namespace.md - 'import/namespace': 'off', - - // Helpful warnings: - - // disallow invalid exports, e.g. multiple defaults - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/export.md - 'import/export': 'error', - - // do not allow a default import name to match a named export - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default.md - 'import/no-named-as-default': 'error', - - // warn on accessing default export property names that are also named exports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default-member.md - 'import/no-named-as-default-member': 'error', - - // disallow use of jsdoc-marked-deprecated imports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-deprecated.md - 'import/no-deprecated': 'off', - - // Forbid the use of extraneous packages - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md - // paths are treated both as absolute paths, and relative to process.cwd() - 'import/no-extraneous-dependencies': ['error', { - devDependencies: [ - 'test/**', // tape, common npm pattern - 'tests/**', // also common npm pattern - 'spec/**', // mocha, rspec-like pattern - '**/__tests__/**', // jest pattern - '**/__mocks__/**', // jest pattern - 'test.{js,jsx}', // repos with a single test file - 'test-*.{js,jsx}', // repos with multiple top-level test files - '**/*{.,_}{test,spec}.{js,jsx}', // tests where the extension or filename suffix denotes that it is a test - '**/jest.config.js', // jest config - '**/vue.config.js', // vue-cli config - '**/webpack.config.js', // webpack config - '**/webpack.config.*.js', // webpack config - '**/rollup.config.js', // rollup config - '**/rollup.config.*.js', // rollup config - '**/gulpfile.js', // gulp config - '**/gulpfile.*.js', // gulp config - '**/Gruntfile{,.js}', // grunt config - '**/protractor.conf.js', // protractor config - '**/protractor.conf.*.js', // protractor config - ], - optionalDependencies: false, - }], - - // Forbid mutable exports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-mutable-exports.md - 'import/no-mutable-exports': 'error', - - // Module systems: - - // disallow require() - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-commonjs.md - 'import/no-commonjs': 'off', - - // disallow AMD require/define - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-amd.md - 'import/no-amd': 'error', - - // No Node.js builtin modules - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-nodejs-modules.md - // TODO: enable? - 'import/no-nodejs-modules': 'off', - - // Style guide: - - // disallow non-import statements appearing before import statements - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/first.md - 'import/first': 'error', - - // disallow non-import statements appearing before import statements - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/imports-first.md - // deprecated: use `import/first` - 'import/imports-first': 'off', - - // disallow duplicate imports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md - 'import/no-duplicates': 'error', - - // disallow namespace imports - // TODO: enable? - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-namespace.md - 'import/no-namespace': 'off', - - // Ensure consistent use of file extension within the import path - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md - 'import/extensions': ['error', 'ignorePackages', { - js: 'never', - mjs: 'never', - jsx: 'never', - }], - - // ensure absolute imports are above relative imports and that unassigned imports are ignored - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md - // TODO: enforce a stricter convention in module import order? - 'import/order': ['error', { groups: [['builtin', 'external', 'internal']] }], - - // Require a newline after the last import/require in a group - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/newline-after-import.md - 'import/newline-after-import': 'error', - - // Require modules with a single export to use a default export - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md - 'import/prefer-default-export': 'error', - - // Restrict which files can be imported in a given folder - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-restricted-paths.md - 'import/no-restricted-paths': 'off', - - // Forbid modules to have too many dependencies - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/max-dependencies.md - 'import/max-dependencies': ['off', { max: 10 }], - - // Forbid import of modules using absolute paths - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-absolute-path.md - 'import/no-absolute-path': 'error', - - // Forbid require() calls with expressions - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-dynamic-require.md - 'import/no-dynamic-require': 'error', - - // prevent importing the submodules of other modules - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-internal-modules.md - 'import/no-internal-modules': ['off', { - allow: [], - }], - - // Warn if a module could be mistakenly parsed as a script by a consumer - // leveraging Unambiguous JavaScript Grammar - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/unambiguous.md - // this should not be enabled until this proposal has at least been *presented* to TC39. - // At the moment, it's not a thing. - 'import/unambiguous': 'off', - - // Forbid Webpack loader syntax in imports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-webpack-loader-syntax.md - 'import/no-webpack-loader-syntax': 'error', - - // Prevent unassigned imports - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unassigned-import.md - // importing for side effects is perfectly acceptable, if you need side effects. - 'import/no-unassigned-import': 'off', - - // Prevent importing the default as if it were named - // https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-default.md - 'import/no-named-default': 'error', - - // Reports if a module's default export is unnamed - // https://github.com/benmosher/eslint-plugin-import/blob/d9b712ac7fd1fddc391f7b234827925c160d956f/docs/rules/no-anonymous-default-export.md - 'import/no-anonymous-default-export': ['off', { - allowArray: false, - allowArrowFunction: false, - allowAnonymousClass: false, - allowAnonymousFunction: false, - allowLiteral: false, - allowObject: false, - }], - - // This rule enforces that all exports are declared at the bottom of the file. - // https://github.com/benmosher/eslint-plugin-import/blob/98acd6afd04dcb6920b81330114e146dc8532ea4/docs/rules/exports-last.md - // TODO: enable? - 'import/exports-last': 'off', - - // Reports when named exports are not grouped together in a single export declaration - // or when multiple assignments to CommonJS module.exports or exports object are present - // in a single file. - // https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/group-exports.md - 'import/group-exports': 'off', - - // forbid default exports. this is a terrible rule, do not use it. - // https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-default-export.md - 'import/no-default-export': 'off', - - // Forbid a module from importing itself - // https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-self-import.md - 'import/no-self-import': 'error', - - // Forbid cyclical dependencies between modules - // https://github.com/benmosher/eslint-plugin-import/blob/d81f48a2506182738409805f5272eff4d77c9348/docs/rules/no-cycle.md - 'import/no-cycle': ['error', { maxDepth: Infinity }], - - // Ensures that there are no useless path segments - // https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/no-useless-path-segments.md - 'import/no-useless-path-segments': 'error', - - // dynamic imports require a leading comment with a webpackChunkName - // https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/dynamic-import-chunkname.md - 'import/dynamic-import-chunkname': ['off', { - importFunctions: [], - webpackChunknameFormat: '[0-9a-zA-Z-_/.]+', - }], - - // Use this rule to prevent imports to folders in relative parent paths. - // https://github.com/benmosher/eslint-plugin-import/blob/c34f14f67f077acd5a61b3da9c0b0de298d20059/docs/rules/no-relative-parent-imports.md - 'import/no-relative-parent-imports': 'off', - - }, -}; \ No newline at end of file diff --git a/phaser-client/.gitignore b/phaser-client/.gitignore deleted file mode 100644 index 2106e507..00000000 --- a/phaser-client/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -package-lock.json -node_modules/ -dist/ -.cache/ -assets/molecules diff --git a/phaser-client/assets/alakazam-f.png b/phaser-client/assets/alakazam-f.png deleted file mode 100644 index f792d2701aee9fa3ffc3130459c569202966b58f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11850 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 diff --git a/phaser-client/assets/alphabet.jpg b/phaser-client/assets/alphabet.jpg deleted file mode 100644 index 9934720132379828cce9999a4c455eea97ec6772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28171 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Ð2a~6 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 fSsEXn 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 ~EHTVn{t=_cPsSQW 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 L>gTe~DWM4fyj^I0 diff --git a/phaser-client/assets/aztec.jpg b/phaser-client/assets/aztec.jpg deleted file mode 100644 index e9700f563060a95c3715009380af8a9dc69eb755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191448 zcmb@t1ymPZxGy|3(j_IGN_TfR(%s$NAu1Bm-61L6-SwwIIz_sXMpD1Q_dREwd+$2u zyK8;liJCi^ zS^(zV002P!=>;$mVaULL044y12?dP_{ih#_0e}LaVW6O(K$m|B9svdx4iWlU_iXtO zHF$=FgMx;EN5BA}p`oDwBq(TD1mM{N77lcT2M{nYv9NJo;*zm⁡xva=#^~prm5w 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

-&+EsaSN&M0_Vwqt391mH@kzoaWuf#BLWm&YK7s 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 H?63dXjFCF~ diff --git a/phaser-client/assets/c1.svg b/phaser-client/assets/c1.svg deleted file mode 100644 index 42347312..00000000 --- a/phaser-client/assets/c1.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/phaser-client/assets/c2.svg b/phaser-client/assets/c2.svg deleted file mode 100644 index d816a009..00000000 --- a/phaser-client/assets/c2.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/phaser-client/assets/c3.svg b/phaser-client/assets/c3.svg deleted file mode 100644 index 0092ae89..00000000 --- a/phaser-client/assets/c3.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/phaser-client/assets/fonts/noway-regular-webfont.eot b/phaser-client/assets/fonts/noway-regular-webfont.eot deleted file mode 100755 index 90f74294a518807794f3862c37ec09ae2e5b6966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32974 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

>yf55FynDVhI-0#%{t1mu(Pt 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/phaser-client/assets/fonts/noway-regular-webfont.ttf b/phaser-client/assets/fonts/noway-regular-webfont.ttf deleted file mode 100755 index c9f82f9a24c5cacc8daf6bf14d4853412287b954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86820 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 diff --git a/phaser-client/assets/fonts/noway-regular-webfont.woff2 b/phaser-client/assets/fonts/noway-regular-webfont.woff2 deleted file mode 100755 index aeb654ccbb00d422ff117afeb42c5c8424b740e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28772 zcmV)4K+3;&Pew8T0RR910B~dg6951J0aGLZ0B`pI0RR9100000000000000000000 z0000#Mn+Uk92#01u@D@EJ_cX_hAs#=34~=42nvL-ID`6A0X7081B_@3hBg2MAO(eY z2a-_?f<8ZYWnyLqTemZDK-ujn$n5|`=q`z=V8@<9cZ!-)E$l9uq64kR0id_b$^QRO zOe!K<(($C-w*SBZRfS*)nTceR&6ViTs7k6itEf-ZD9WsfwXYfjo@qt94nDBLp|I~6 zIYTM**>GPEQ9aM(Yd8xsKN2pQ#;Xq$-X8Rz!+g?*3)OOOugz$uu28J{lH4W;qPxjl z?e7Df3NlL#Z-rJYg;tB#r0<{Kx?WUdnEvRK`-KUkL}G~sInwm5+w=}|*BWOuFt{Vb zv4Qnp(bc1TZe@+JF|>NAS#qRL>!*O$p3mx;S-4|`7(kYZ2L>Z9>Z<^I1V^AO@cVf@ z{XaLkN$WLj2EJ_0nh~9VKESOX!1>wpm)QZ>W`QCic46l%6oWDd69uENKtK>N62uBj zEEIIpn{k_SQEs{l*LQAxbL)4Z_qX)_)9Lq~z>(gStUy^U_j_hElIJH1o0h=xG*Z$f z?JifuVEDjIyZ!G!V1JvbxQVZqVf8Sj4QnzjGB1j)7k>g$YKMP2)lPtb|M<`U0D!@D z^?NYH$>#{QvOVeK?@8f_Okg4>kVpdYc>?h~{<#5S&-35k^Lw{HPybBB5d;E(tbO*O z4;m&KW|{wE+6vb?piA>wN0M;tIA0Cbgd|~NXDr>u5``jCZqu|@eXK5s1327E$EZII z&ei{a+5k7uq>$pY13NpkfQRlQG~$yG;tKb`sBZ+{Z`EVXKm*-CQw7t^asKP9q{u}s z8y6R0@}lF^sCm{Gg8UijBGqy<7!NU#p!5C-Em%#{uE-}Oh`uLL~#Fsvq%xW4A0 zI*VuvOe<_ArxH1{!mwYiSjxixzfkF4NoFnjo=Z3m8?VLVV9zK*IC2t8BGt z&ODL;13dKq7XIs1t$$czb~qY~Cs73HN5)YW8rN&=|3Q}D)2|^_Z4_*f{{y1<@db$_T=)q$nkj{%9HrmSPeT#n{G-EoGYbdFO9^2I5-tHK zME`~SM8w7T=YZA{&9Nps3U40dn=lXx3p`052phX{Wq|wtO|`eZ_stCPKuY=Bmewhk zF1i6g$|-kl3YVPsW(J%D2=fNO0s~S9L4gD}5a0$9((YgYXhDkF5AmlI8TN-1PVX|6 zA(t+@-F22bSFT-jo^Q_Arb9Gl!p#!6?_7b>{B|$BuHEID0YUZ&FLy~k=Ocjpo0^=l zY|&UUwsK02>0sj_Dg3L?_B}1|M3M7&M+g!mi1&TW? zvx!EuCm=;&1|~jl^Jn(!G?GjEdZk^dTTC&17ce%KWC?O_=E@?#Utj%e-tOn$8|#Z_ zCWBlHyavD^gNPxL;zf{J4`_or3O82<*eZj`wR$jMYse_Pwz}}<1cS^CTQG^O9Q7FC>=NNu<9qVF`dp)!UH^K+@ z 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 diff --git a/phaser-client/assets/glyphs.jpg b/phaser-client/assets/glyphs.jpg deleted file mode 100644 index 7dd065be6850d7d618bdd4b7a5d1420ae26e4516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56616 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 diff --git a/phaser-client/assets/magmar.png b/phaser-client/assets/magmar.png deleted file mode 100644 index c59cad7ad16e6716423a6cab9ed96a2c03e34cd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9551 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 - - - constructs.gg - mnml pvp atbs - - - - - - - - - - - - \ No newline at end of file diff --git a/phaser-client/index.js b/phaser-client/index.js deleted file mode 100644 index ff86aee9..00000000 --- a/phaser-client/index.js +++ /dev/null @@ -1,4 +0,0 @@ -require('./constructs.css'); - -// kick it off -require('./src/main'); diff --git a/phaser-client/lib/fizzy-noise.js b/phaser-client/lib/fizzy-noise.js deleted file mode 100644 index 20b6510f..00000000 --- a/phaser-client/lib/fizzy-noise.js +++ /dev/null @@ -1,189 +0,0 @@ -// http://mrl.nyu.edu/~perlin/noise/ - -const ImprovedNoise = function () { - const p = [151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, - 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, - 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, - 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, - 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, - 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, - 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, - 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, - 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, - 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180]; - - for (let i = 0; i < 256; i++) { - p[256 + i] = p[i]; - } - - function fade(t) { - return t * t * t * (t * (t * 6 - 15) + 10); - } - - function lerp(t, a, b) { - return a + t * (b - a); - } - - function grad(hash, x, y, z) { - const h = hash & 15; - const u = h < 8 ? x : y; const - v = h < 4 ? y : h == 12 || h == 14 ? x : z; - return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v); - } - - return { - - noise(x, y, z) { - const floorX = Math.floor(x); const floorY = Math.floor(y); const - floorZ = Math.floor(z); - - const X = floorX & 255; const Y = floorY & 255; const - Z = floorZ & 255; - - x -= floorX; - y -= floorY; - z -= floorZ; - - const xMinus1 = x - 1; const yMinus1 = y - 1; const - zMinus1 = z - 1; - - const u = fade(x); const v = fade(y); const - w = fade(z); - - const A = p[X] + Y; const AA = p[A] + Z; const AB = p[A + 1] + Z; const B = p[X + 1] + Y; const BA = p[B] + Z; const - BB = p[B + 1] + Z; - - return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z), - grad(p[BA], xMinus1, y, z)), - lerp(u, grad(p[AB], x, yMinus1, z), - grad(p[BB], xMinus1, yMinus1, z))), - lerp(v, lerp(u, grad(p[AA + 1], x, y, zMinus1), - grad(p[BA + 1], xMinus1, y, z - 1)), - lerp(u, grad(p[AB + 1], x, yMinus1, zMinus1), - grad(p[BB + 1], xMinus1, yMinus1, zMinus1)))); - }, - }; -}; - -const currentRandom = Math.random; - -// Pseudo-random generator -function Marsaglia(i1, i2) { - // from http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c - let z = i1 || 362436069; let - w = i2 || 521288629; - const nextInt = function () { - z = (36969 * (z & 65535) + (z >>> 16)) & 0xFFFFFFFF; - w = (18000 * (w & 65535) + (w >>> 16)) & 0xFFFFFFFF; - return (((z & 0xFFFF) << 16) | (w & 0xFFFF)) & 0xFFFFFFFF; - }; - - this.nextDouble = function () { - const i = nextInt() / 4294967296; - return i < 0 ? 1 + i : i; - }; - this.nextInt = nextInt; -} -Marsaglia.createRandomized = function () { - const now = new Date(); - return new Marsaglia((now / 60000) & 0xFFFFFFFF, now & 0xFFFFFFFF); -}; - -// Noise functions and helpers -function PerlinNoise(seed) { - const rnd = seed !== undefined ? new Marsaglia(seed) : Marsaglia.createRandomized(); - let i; let - j; - // http://www.noisemachine.com/talk1/17b.html - // http://mrl.nyu.edu/~perlin/noise/ - // generate permutation - const p = new Array(512); - for (i = 0; i < 256; ++i) { p[i] = i; } - for (i = 0; i < 256; ++i) { const t = p[j = rnd.nextInt() & 0xFF]; p[j] = p[i]; p[i] = t; } - // copy to avoid taking mod in p[0]; - for (i = 0; i < 256; ++i) { p[i + 256] = p[i]; } - - function grad3d(i, x, y, z) { - const h = i & 15; // convert into 12 gradient directions - const u = h < 8 ? x : y; - - - const v = h < 4 ? y : h === 12 || h === 14 ? x : z; - return ((h & 1) === 0 ? u : -u) + ((h & 2) === 0 ? v : -v); - } - - function grad2d(i, x, y) { - const v = (i & 1) === 0 ? x : y; - return (i & 2) === 0 ? -v : v; - } - - function grad1d(i, x) { - return (i & 1) === 0 ? -x : x; - } - - function lerp(t, a, b) { return a + t * (b - a); } - - this.noise3d = function (x, y, z) { - const X = Math.floor(x) & 255; const Y = Math.floor(y) & 255; const - Z = Math.floor(z) & 255; - x -= Math.floor(x); y -= Math.floor(y); z -= Math.floor(z); - const fx = (3 - 2 * x) * x * x; const fy = (3 - 2 * y) * y * y; const - fz = (3 - 2 * z) * z * z; - const p0 = p[X] + Y; const p00 = p[p0] + Z; const p01 = p[p0 + 1] + Z; const p1 = p[X + 1] + Y; const p10 = p[p1] + Z; const - p11 = p[p1 + 1] + Z; - return lerp(fz, - lerp(fy, lerp(fx, grad3d(p[p00], x, y, z), grad3d(p[p10], x - 1, y, z)), - lerp(fx, grad3d(p[p01], x, y - 1, z), grad3d(p[p11], x - 1, y - 1, z))), - lerp(fy, lerp(fx, grad3d(p[p00 + 1], x, y, z - 1), grad3d(p[p10 + 1], x - 1, y, z - 1)), - lerp(fx, grad3d(p[p01 + 1], x, y - 1, z - 1), grad3d(p[p11 + 1], x - 1, y - 1, z - 1)))); - }; - - this.noise2d = function (x, y) { - const X = Math.floor(x) & 255; const - Y = Math.floor(y) & 255; - x -= Math.floor(x); y -= Math.floor(y); - const fx = (3 - 2 * x) * x * x; const - fy = (3 - 2 * y) * y * y; - const p0 = p[X] + Y; const - p1 = p[X + 1] + Y; - return lerp(fy, - lerp(fx, grad2d(p[p0], x, y), grad2d(p[p1], x - 1, y)), - lerp(fx, grad2d(p[p0 + 1], x, y - 1), grad2d(p[p1 + 1], x - 1, y - 1))); - }; - - this.noise1d = function (x) { - const X = Math.floor(x) & 255; - x -= Math.floor(x); - const fx = (3 - 2 * x) * x * x; - return lerp(fx, grad1d(p[X], x), grad1d(p[X + 1], x - 1)); - }; -} - -// these are lifted from Processing.js -// processing defaults -const noiseProfile = { - generator: undefined, octaves: 4, fallout: 0.5, seed: undefined, -}; - -module.exports = function noise(x, y, z) { - if (noiseProfile.generator === undefined) { - // caching - noiseProfile.generator = new PerlinNoise(noiseProfile.seed); - } - const generator = noiseProfile.generator; - let effect = 1; let k = 1; let - sum = 0; - for (let i = 0; i < noiseProfile.octaves; ++i) { - effect *= noiseProfile.fallout; - switch (arguments.length) { - case 1: - sum += effect * (1 + generator.noise1d(k * x)) / 2; break; - case 2: - sum += effect * (1 + generator.noise2d(k * x, k * y)) / 2; break; - case 3: - sum += effect * (1 + generator.noise3d(k * x, k * y, k * z)) / 2; break; - } - k *= 2; - } - return sum; -}; diff --git a/phaser-client/lib/fizzy-text.js b/phaser-client/lib/fizzy-text.js deleted file mode 100644 index bee34d8e..00000000 --- a/phaser-client/lib/fizzy-text.js +++ /dev/null @@ -1,220 +0,0 @@ -const noise = require('./fizzy-noise'); - -function fizzyText(message) { - const that = this; - - // These are the variables that we manipulate with gui-dat. - // Notice they're all defined with "this". That makes them public. - // Otherwise, gui-dat can't see them. - - this.growthSpeed = 0.8; // how fast do particles change size? - this.minSize = 1; - this.maxSize = 4; // how big can they get? - this.noiseStrength = 10; // how turbulent is the flow? - this.speed = 0.4; // how fast do particles move? - this.displayOutline = false; // should we draw the message as a stroke? - this.framesRendered = 0; - - // ////////////////////////////////////////////////////////////// - - const _this = this; - - const width = 550; - const height = 200; - const textAscent = 101; - const textOffsetLeft = 80; - const noiseScale = 300; - const frameTime = 30; - - const colors = ['#000000', '#1A1A1A', '#163C50', '#205A79', '#2A78A2']; - - // This is the context we use to get a bitmap of text using - // the getImageData function. - const r = document.createElement('canvas'); - const s = r.getContext('2d'); - - // This is the context we actually use to draw. - const c = document.createElement('canvas'); - const g = c.getContext('2d'); - - r.setAttribute('width', width); - c.setAttribute('width', width); - r.setAttribute('height', height); - c.setAttribute('height', height); - - // Add our demo to the HTML - document.getElementById('fizzytext').appendChild(c); - - // Stores bitmap image - let pixels = []; - - // Stores a list of particles - const particles = []; - - // Set g.font to the same font as the bitmap canvas, incase we - // want to draw some outlines. - s.font = g.font = '800 82px monospace, monospace'; - - // Instantiate some particles - for (let i = 0; i < 1000; i++) { - particles.push(new Particle(Math.random() * width, Math.random() * height)); - } - - // This function creates a bitmap of pixels based on your message - // It's called every time we change the message property. - const createBitmap = function (msg) { - s.fillStyle = '#fff'; - s.fillRect(0, 0, width, height); - - s.fillStyle = '#222'; - s.fillText(msg, textOffsetLeft, textAscent); - - // Pull reference - const imageData = s.getImageData(0, 0, width, height); - pixels = imageData.data; - }; - - // Called once per frame, updates the animation. - const render = function () { - that.framesRendered++; - - g.clearRect(0, 0, width, height); - - if (_this.displayOutline) { - g.globalCompositeOperation = 'source-over'; - g.strokeStyle = '#000'; - g.lineWidth = 0.5; - g.strokeText(message, textOffsetLeft, textAscent); - } - - g.globalCompositeOperation = 'darker'; - - for (let i = 0; i < particles.length; i++) { - g.fillStyle = colors[i % colors.length]; - particles[i].render(); - } - }; - - // Returns x, y coordinates for a given index in the pixel array. - const getPosition = function (i) { - return { - x: (i - (width * 4) * Math.floor(i / (width * 4))) / 4, - y: Math.floor(i / (width * 4)), - }; - }; - - // Returns a color for a given pixel in the pixel array. - const getColor = function (x, y) { - const base = (Math.floor(y) * width + Math.floor(x)) * 4; - const c = { - r: pixels[base + 0], - g: pixels[base + 1], - b: pixels[base + 2], - a: pixels[base + 3], - }; - - return `rgb(${c.r},${c.g},${c.b})`; - }; - - this.message = message; - createBitmap(message); - - var loop = function () { - requestAnimationFrame(loop); - render(); - }; - - // This calls the render function every 30 milliseconds. - loop(); - - // This class is responsible for drawing and moving those little - // colored dots. - function Particle(x, y, c) { - // Position - this.x = x; - this.y = y; - - // Size of particle - this.r = 1; - - // This velocity is used by the explode function. - this.vx = 0; - this.vy = 0; - - this.constrain = function constrainFn(v, o1, o2) { - if (v < o1) v = o1; - else if (v > o2) v = o2; - return v; - }; - - // Called every frame - this.render = function renderFrame() { - // What color is the pixel we're sitting on top of? - const c = getColor(this.x, this.y); - - // Where should we move? - const angle = noise(this.x / noiseScale, this.y / noiseScale) * _this.noiseStrength; - // var angle = -Math.PI/2; - - // Are we within the boundaries of the image? - const onScreen = this.x > 0 && this.x < width && this.y > 0 && this.y < height; - - const isBlack = c !== 'rgb(255,255,255)' && onScreen; - - // If we're on top of a black pixel, grow. - // If not, shrink. - if (isBlack) { - this.r += _this.growthSpeed; - } else { - this.r -= _this.growthSpeed; - } - - // This velocity is used by the explode function. - this.vx *= 0.5; - this.vy *= 0.5; - - // Change our position based on the flow field and our - // explode velocity. - this.x += Math.cos(angle) * _this.speed + this.vx; - this.y += -Math.sin(angle) * _this.speed + this.vy; - - if (this.r > _this.maxSize) { - this.r = _this.maxSize; - } else if (this.r < 0) { - this.r = 0; - this.x = Math.random() * width; - this.y = Math.random() * height; - return false; - } - - // this.r = 3; - // debugger - // console.log(DAT.GUI.constrain(this.r, 0, _this.maxSize)); - // this.r = this.constrain(this.r, _this.minSize, _this.maxSize); - - // If we're tiny, keep moving around until we find a black - // pixel. - if (this.r <= 0) { - this.x = Math.random() * width; - this.y = Math.random() * height; - return false; // Don't draw! - } - - // If we're off the screen, go over to other side - if (this.x < 0) this.x = width; - if (this.x > width) this.x = 0; - if (this.y < 0) this.y = height; - if (this.y > height) this.y = 0; - - // Draw the circle. - g.beginPath(); - // g.arc(this.x, this.y, this.r, 0, Math.PI * 2, false); - g.rect(this.x, this.y, this.r, this.r); - g.fill(); - - return true; - }; - } -} - -module.exports = fizzyText; diff --git a/phaser-client/package.json b/phaser-client/package.json deleted file mode 100644 index b62d7ce2..00000000 --- a/phaser-client/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "constructs-client", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "parcel index.html --port 40080 --no-hmr --no-source-maps", - "build": "rm -rf dist && parcel build --no-source-maps index.html", - "lint": "eslint --fix src/", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "UNLICENSED", - "dependencies": { - "async": "^2.6.1", - "borc": "^2.0.3", - "docco": "^0.7.0", - "izitoast": "^1.4.0", - "jdenticon": "^2.1.0", - "key": "^0.1.11", - "keymaster": "^1.6.2", - "lodash": "^4.17.11", - "parcel": "^1.11.0", - "phaser": "^3.16.1", - "redux": "^4.0.0" - }, - "devDependencies": { - "eslint": "^5.6.0", - "eslint-config-airbnb-base": "^13.1.0", - "eslint-plugin-import": "^2.14.0", - "jest": "^18.0.0" - } -} diff --git a/phaser-client/src/events.js b/phaser-client/src/events.js deleted file mode 100644 index bfc600d0..00000000 --- a/phaser-client/src/events.js +++ /dev/null @@ -1,219 +0,0 @@ -const toast = require('izitoast'); - -function registerEvents(registry, events, tutorial) { - function setConstructs(constructs) { - registry.set('constructs', constructs); - tutorial('homepage'); - } - - function setConstructList(constructs) { - registry.set('constructList', constructs); - } - - - function setWs(ws) { - registry.set('ws', ws); - } - - function setGame(game) { - if (game.phase === 'Skill') tutorial('skillPhase'); - if (game.phase === 'Target') tutorial('targetPhase'); - if (game.resolved.length) tutorial('resolutionPhase'); - if (game.phase === 'Finish') tutorial('finishPhase'); - return registry.set('game', game); - } - - function setAccount(account) { - registry.set('account', account); - registry.set('home', true); - events.emit('ACCOUNT', account); - } - - function setActiveSkill(skill) { - registry.set('activeSkill', skill); - } - - function setMenu() { - registry.set('menu', true); - } - - function setVbox(items) { - registry.set('vbox', items); - } - - function setScores(scores) { - registry.set('scores', scores); - } - - function setPlayerList(list) { - registry.set('playerList', list); - registry.set('homeInstances', true); - } - - function setPlayer(player) { - registry.set('player', player); - if (!registry.get('inMenu')) { - setMenu(); - } - } - - function setZone(zone) { - registry.set('zone', zone); - } - - function setGameList(gameList) { - registry.set('gameList', gameList); - } - - function setConstructStatusUpdate(id, skill, target) { - registry.set('constructStatusUpdate', { id, skill, target }); - } - - events.on('SET_PLAYER', setPlayer); - - events.on('SEND_SKILL', function skillActive(gameId, constructId, targetConstructId, skill) { - const ws = registry.get('ws'); - ws.sendGameSkill(gameId, constructId, targetConstructId, skill); - setConstructStatusUpdate(constructId, skill, targetConstructId); - }); - - events.on('CONSTRUCT_ACTIVE', function constructActiveCb(construct) { - const constructs = registry.get('constructs'); - for (let i = 0; i < constructs.length; i += 1) { - if (constructs[i].id === construct.id) constructs[i].active = !constructs[i].active; - } - return setConstructs(constructs); - }); - - const errMessages = { - select_constructs: 'Select your constructs before battle using the numbered buttons next to the construct avatar', - complete_nodes: 'You need to complete the previously connected nodes first', - max_skills: 'Your construct can only learn a maximum of 4 skills', - - }; - - function errorPrompt(type) { - const message = errMessages[type]; - const OK_BUTTON = ''; - toast.info({ - theme: 'dark', - color: 'black', - timeout: false, - drag: false, - position: 'center', - maxWidth: window.innerWidth / 2, - close: false, - buttons: [ - [OK_BUTTON, (instance, thisToast) => instance.hide({ transitionOut: 'fadeOut' }, thisToast)], - ], - message, - }); - } - - function loginPrompt() { - const USER_INPUT = ''; - const PASSWORD_INPUT = ''; - const LOGIN_BUTTON = ''; - const REGISTER_BUTTON = ''; - const DEMO_BUTTON = ''; - - const ws = registry.get('ws'); - - function submitLogin(instance, thisToast, button, e, inputs) { - const USERNAME = inputs[0].value; - const PASSWORD = inputs[1].value; - ws.sendAccountLogin(USERNAME, PASSWORD); - } - - function submitRegister(instance, thisToast, button, e, inputs) { - const USERNAME = inputs[0].value; - const PASSWORD = inputs[1].value; - ws.sendAccountCreate(USERNAME, PASSWORD); - } - - function submitDemo() { - ws.sendAccountDemo(); - } - - const existing = document.querySelector('#login'); // Selector of your toast - if (existing) toast.hide({}, existing, 'reconnect'); - - toast.question({ - id: 'login', - theme: 'dark', - color: 'black', - timeout: false, - // overlay: true, - drag: false, - close: false, - title: 'LOGIN', - position: 'center', - inputs: [ - [USER_INPUT, 'change', () => true, true], // true to focus - [PASSWORD_INPUT, 'change', () => true], - ], - buttons: [ - [LOGIN_BUTTON, submitLogin], // true to focus - [REGISTER_BUTTON, submitRegister], // true to focus - [DEMO_BUTTON, submitDemo], // true to focus - ], - }); - - events.once('ACCOUNT', function closeLoginCb() { - const prompt = document.querySelector('#login'); // Selector of your toast - if (prompt) toast.hide({ transitionOut: 'fadeOut' }, prompt, 'event'); - }); - } - - events.on('CONSTRUCT_SPAWN', function spawnPrompt() { - const NAME_INPUT = ''; - const SPAWN_BUTTON = ''; - - const ws = registry.get('ws'); - - function submitSpawn(instance, thisToast, button, e, inputs) { - const NAME = inputs[0].value; - ws.sendConstructSpawn(NAME); - instance.hide({ transitionOut: 'fadeOut' }, thisToast, 'button'); - } - - toast.question({ - theme: 'dark', - color: 'black', - timeout: false, - // overlay: true, - drag: false, - close: true, - title: 'SPAWN CONSTRUCT', - position: 'center', - inputs: [ - [NAME_INPUT, 'change', null, true], // true to focus - ], - buttons: [ - [SPAWN_BUTTON, submitSpawn], // true to focus - ], - }); - }); - - tutorial('welcome'); - - return { - errorPrompt, - loginPrompt, - setAccount, - setActiveSkill, - setConstructs, - setConstructList, - setGame, - setMenu, - setPlayer, - setPlayerList, - setVbox, - setWs, - setGameList, - setZone, - setScores, - }; -} - -module.exports = registerEvents; diff --git a/phaser-client/src/main.js b/phaser-client/src/main.js deleted file mode 100644 index ef2fbede..00000000 --- a/phaser-client/src/main.js +++ /dev/null @@ -1,17 +0,0 @@ -const renderConstructs = require('./scenes/constructs'); - -const createSocket = require('./socket'); -const registerEvents = require('./events'); -const createTutorial = require('./tutorial'); - -document.fonts.load('10pt "Jura"').then(() => { - const game = renderConstructs(); - const tutorial = createTutorial(); - const events = registerEvents(game.registry, game.events, tutorial); - const ws = createSocket(events); - - // events.setWs(ws); - // events.setGameList([]); - - ws.connect(); -}); diff --git a/phaser-client/src/scenes/avatar.js b/phaser-client/src/scenes/avatar.js deleted file mode 100644 index 0ca54da0..00000000 --- a/phaser-client/src/scenes/avatar.js +++ /dev/null @@ -1,13 +0,0 @@ -const genAvatar = (name) => { - let hash = 0; - if (name.length === 0) return hash; - // Probs don't need to hash using the whole string - for (let i = 0; i < name.length; i += 1) { - const chr = name.charCodeAt(i); - hash = ((hash << 5) - hash) + chr; - hash = hash & 10000; // We have avatars named 0-19 - } - return `sprite${hash}`; -}; - -module.exports = genAvatar; diff --git a/phaser-client/src/scenes/background.js b/phaser-client/src/scenes/background.js deleted file mode 100644 index 7baaadd7..00000000 --- a/phaser-client/src/scenes/background.js +++ /dev/null @@ -1,166 +0,0 @@ -const Phaser = require('phaser'); - -const CHART = ` -#ifdef GL_ES -precision mediump float; -#endif - -#extension GL_OES_standard_derivatives : enable - -uniform float time; -uniform vec2 mouse; -uniform vec2 resolution; - -float rand(float n){return fract(sin(n) * 43758.5453123 * time * 0.00001);} - -float noise(float p){ - float fl = floor(p); - float fc = fract(p); - // return mix(rand(fl), rand(fl + 1.0), p); - return mix(rand(fl), rand(fl + 1.0), p); -} - -float getLine(vec2 p, float y){ - float margin = 0.; - - vec2 pos = p; - float a = time * 100. + y * 31.; - vec2 lineCenter = vec2(0.5, y); - - pos -= lineCenter; - pos *- mat2(cos(a), -sin(a), sin(a), cos(a)); - pos += lineCenter; - - - float marginb = 0.005; - float b = 0.004; - float t = y + (noise((pos.x + y) * 100.) - 0.5) * 0.02; - float f = (smoothstep(t - b, t, pos.y) - smoothstep(t, t + b, pos.y)); - f *= smoothstep(margin - marginb, margin, pos.x) - smoothstep(1. - margin, 1. - margin + marginb, pos.x); - f *= 0.8; - - float light = 0.5 + 0.5 * sin(time * .2); - vec2 point = vec2(margin + light * (1. - margin * 2.), t); - f += .008 / distance(pos, point); - return f; -} - -void main( void ) { - vec2 p = gl_FragCoord.xy / resolution.xy; - float f = 0.; - - for(int i = 0; i < 10; i++){ - f += getLine(p, 0.1 + (0.8) / 10. * float(i)); - } - - vec3 color = vec3(0., .4, .6) * f; - gl_FragColor = vec4(color, 1.); -}`; - -const STARS = ` -//--- hatsuyuki --- -// by Catzpaw 2016 -#ifdef GL_ES -precision mediump float; -#endif - -#extension GL_OES_standard_derivatives : enable - -uniform float time; -uniform vec2 resolution; - float hash(float x){ - return fract(sin(x*133.3)*12.13); - } - void main(void){ - vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y); - vec3 c=vec3(.2,.2,.2); - float a=4.4; - float si=sin(a),co=cos(a); - uv*=mat2(co,-si,si,co); - uv*=length(uv+vec2(0,1.9))*.5+1.; - float v=1.-sin(hash(floor(uv.x*200.))*2.); - float b=clamp(abs(sin(5.*time*v+uv.y*(5./(2.+v))))-.95,0.,1.)*20.; - c*=v*b; - gl_FragColor = vec4(c,2); -} -`; - -const PLASMA = ` -precision mediump float; - -uniform sampler2D uMainSampler; -uniform vec2 resolution; -uniform float time; - -varying vec2 outTexCoord; -varying vec4 outTint; - -#define MAX_ITER 4 - -void main( void ) -{ - vec2 v_texCoord = gl_FragCoord.xy / resolution; - - vec2 p = v_texCoord * 8.0 - vec2(20.0); - vec2 i = p; - float c = 1.0; - float inten = .05; - - for (int n = 0; n < MAX_ITER; n++) - { - float t = time * (1.0 - (3.0 / float(n+1))); - - i = p + vec2(cos(t - i.x) + sin(t + i.y), - sin(t - i.y) + cos(t + i.x)); - - c += 1.0/length(vec2(p.x / (sin(i.x+t)/inten), - p.y / (cos(i.y+t)/inten))); - } - - c /= float(MAX_ITER); - c = 1.5 - sqrt(c); - - vec4 texColor = vec4(0.01, 0.01, 0.01, 1.0); - - texColor.rgb *= (1.0 / (1.0 - (c + 0.05))); - - gl_FragColor = texColor; -} -`; - -const CustomPipeline = new Phaser.Class({ - Extends: Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline, - initialize: function CustomPipeline (game) { - Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline.call(this, { - game, - renderer: game.renderer, - fragShader: STARS, - }); - }, -}); - - -class Background extends Phaser.Scene { - constructor() { - super({ key: 'Background', active: true }); - this.bgTime = 10.0; - } - - create() { - const game = this.game; - this.customPipeline = game.renderer.addPipeline('Custom', new CustomPipeline(game)); - this.customPipeline.setFloat2('resolution', 1600, 1000); - - const sprite = this.add.sprite(800, 500); - sprite.setPipeline('Custom'); - sprite.displayWidth = 1600 * window.devicePixelRatio; - sprite.displayHeight = 1000 * window.devicePixelRatio; - } - - update() { - this.customPipeline.setFloat1('time', this.bgTime); - this.bgTime += 0.005; - } -} - -module.exports = Background; diff --git a/phaser-client/src/scenes/combat.animations.js b/phaser-client/src/scenes/combat.animations.js deleted file mode 100644 index 7a1ef934..00000000 --- a/phaser-client/src/scenes/combat.animations.js +++ /dev/null @@ -1,250 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { COMBAT }, DELAYS } = require('./constants'); - -const randomColour = () => { - const colours = ['green', 'blue', 'red', 'white', 'yellow']; - return colours[Math.floor(Math.random() * 5)]; -}; - -const animationParams = (sourceAlly) => { - const spawnLocation = sourceAlly ? COMBAT.width() * 0.35 : COMBAT.width() * 0.65; - const speed = sourceAlly ? 250 : -250; - const img = randomColour(); - const angleMin = sourceAlly ? 320 : 180; - const angleMax = sourceAlly ? 360 : 220; - return { spawnLocation, speed, img, angleMin, angleMax }; -}; - -const randomAttack = () => { - const animations = ['wall', 'spit', 'gravBlast', 'gravBomb', 'chargeBall']; - return animations[Math.floor(Math.random() * 5)]; -}; - -class CombatSkills extends Phaser.GameObjects.Group { - constructor(scene) { - super(scene); - this.scene = scene; - } - - getSkill(type, sourceAlly, targetAlly, castLocation) { - const genericHeal = ['Heal', 'Triage', 'TriageTick', 'DecayTick']; - const genericBlock = ['Block', 'Parry', 'Evasion', 'Shield']; - - if (genericHeal.includes(type)) { - this.genericHeal(targetAlly, castLocation); - } else if (genericBlock.includes(type)) { - this.genericBlock(sourceAlly); - } else { - this[randomAttack()](sourceAlly); - } - } - - genericHeal(sourceAlly, castLocation) { - // const { sourceX, sourceY } = getConstructPosition(sourcePos, 0); - const lifespan = DELAYS.ANIMATION_DURATION; - const colour = randomColour(); - const particles = this.scene.add.particles(colour); - const x = sourceAlly ? COMBAT.width() * 0.3 : COMBAT.width() * 0.7; - - const emitter2 = particles.createEmitter({ - x: castLocation.x, - y: castLocation.y, - moveToX: x, - moveToY: COMBAT.height() * 0.2, - speed: 500, - lifespan: lifespan / 3, - scale: { start: 0.5, end: 1 }, - quantity: 3, - _frequency: 20, - blendMode: 'ADD', - emitZone: { source: new Phaser.Geom.Rectangle(-200, -100, 400, 200) }, - }); - - const emitter = particles.createEmitter({ - x, - y: COMBAT.height() * 0.2, - angle: { min: 250, max: 290 }, - speed: 250, - gravityY: 1000, - quantity: 4, - scale: { start: 0.1, end: 1 }, - blendMode: 'ADD', - lifespan, - active: false, - }); - - - this.add(particles); - this.scene.time.delayedCall(lifespan / 3, () => { emitter2.stop(); }, [], this); - this.scene.time.delayedCall(lifespan / 3, () => { emitter.active = true; }, [], this); - - this.scene.time.delayedCall(lifespan, () => { emitter.stop(); }, [], this); - } - - genericBlock(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - const colour = randomColour(); - const x = sourceAlly ? COMBAT.width() * 0.3 : COMBAT.width() * 0.7; - const emitter1 = this.scene.add.particles(colour).createEmitter({ - x, - y: COMBAT.height() * 0.4, - scale: { start: 0.75, end: 0.25 }, - blendMode: 'ADD', - emitZone: { - source: new Phaser.Geom.Rectangle(-100, -100, 200, 200), - type: 'edge', - quantity: 24, - yoyo: true, - }, - }); - const emitter2 = this.scene.add.particles(colour).createEmitter({ - x, - y: COMBAT.height() * 0.4, - blendMode: 'SCREEN', - scale: { start: 0.2, end: 0 }, - speed: { min: -100, max: 100 }, - quantity: 50, - active: false, - emitZone: { - source: new Phaser.Geom.Rectangle(-100, -100, 200, 200), - type: 'edge', - quantity: 50, - }, - }); - this.scene.time.delayedCall(lifespan / 2, () => { emitter1.stop(); }, [], this); - this.scene.time.delayedCall(lifespan / 2, () => { emitter2.active = true; }, [], this); - this.scene.time.delayedCall(lifespan, () => { emitter2.stop(); }, [], this); - } - - wall(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - const { spawnLocation, speed, img } = animationParams(sourceAlly); - const particles = this.scene.add.particles(img); - const emitter = particles.createEmitter({ - x: spawnLocation, - y: { min: COMBAT.height() * 0.2, max: COMBAT.height() * 0.5 }, - speedX: { min: speed, max: speed * 2 }, - scale: { start: 0.4, end: 0 }, - quantity: 4, - blendMode: 'ADD', - lifespan, - }); - this.add(particles); - this.scene.time.delayedCall(1000, () => { emitter.stop(); }, [], this.scene); - } - - spit(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - const { spawnLocation, speed, img, angleMin, angleMax } = animationParams(sourceAlly); - const particles = this.scene.add.particles(img); - const emitter = particles.createEmitter({ - x: spawnLocation, - y: COMBAT.height() * 0.35, - angle: { min: angleMin, max: angleMax }, - speed: speed * 2, - scale: { start: 0.4, end: 1 }, - gravityY: 250, - quantity: 4, - blendMode: 'ADD', - lifespan, - }); - this.add(particles); - this.scene.time.delayedCall(lifespan, () => { emitter.stop(); }, [], this); - } - - gravBomb(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - - const { spawnLocation, img } = animationParams(!sourceAlly); - const particles = this.scene.add.particles(img); - const well = particles.createGravityWell({ - x: spawnLocation, - y: COMBAT.height() * 0.25, - power: 4, - gravity: 500, - }); - this.emitter = particles.createEmitter({ - x: spawnLocation, - y: COMBAT.height() * 0.25, - speed: 1000, - scale: { start: 0.7, end: 1 }, - blendMode: 'ADD', - lifespan, - }); - this.add(particles); - this.scene.time.delayedCall(lifespan, () => { this.emitter.stop(); well.active = false; }, [], this.scene); - } - - gravBlast(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - const WELL_END = lifespan / 2; - - const img = randomColour(); - const spawnLocation = sourceAlly ? COMBAT.width() * 0.35 : COMBAT.width() * 0.65; - const isEnemyLocation = sourceAlly ? COMBAT.width() * 0.7 : COMBAT.width() * 0.3; - const particles = this.scene.add.particles(img); - const bounds = sourceAlly - ? { x: COMBAT.width() * 0.3, y: COMBAT.height() * 0.2, w: COMBAT.width() * 0.5, h: COMBAT.height() * 0.2 } - : { x: 0.2 * COMBAT.width(), y: COMBAT.height() * 0.2, w: COMBAT.width() * 0.5, h: COMBAT.height() * 0.2 }; - const well = particles.createGravityWell({ - x: spawnLocation, - y: COMBAT.height() * 0.35, - power: 4, - gravity: 500, - }); - const emitter = particles.createEmitter({ - x: spawnLocation, - y: COMBAT.height() * 0.35, - speed: 1000, - scale: { start: 0.7, end: 1 }, - blendMode: 'ADD', - bounds, - lifespan, - }); - this.add(particles); - this.scene.time.delayedCall(WELL_END, () => { emitter.stop(); well.x = isEnemyLocation; }, [], this.scene); - this.scene.time.delayedCall(lifespan, () => { well.active = false; }, [], this.scene); - } - - chargeBall(sourceAlly) { - const lifespan = DELAYS.ANIMATION_DURATION; - const CHARGE_LIFESPAN = lifespan / 3; - - const { img, spawnLocation } = animationParams(sourceAlly); - const targetLocation = sourceAlly ? 0.7 * COMBAT.width() : 0.25 * COMBAT.width(); - const particles = this.scene.add.particles(img); - const emitter = particles.createEmitter({ - x: 0, - y: 0, - moveToX: spawnLocation, - moveToY: COMBAT.height() * 0.1, - scale: 0.75, - quantity: 4, - _frequency: 20, - blendMode: 'ADD', - emitZone: { source: new Phaser.Geom.Rectangle(0, 0, COMBAT.width(), COMBAT.height()) }, - lifespan: CHARGE_LIFESPAN, - }); - const emitter2 = particles.createEmitter({ - radial: false, - x: { min: spawnLocation, max: targetLocation, steps: 90 }, - y: { min: COMBAT.height() * 0.1, max: COMBAT.height() * 0.4, steps: 90 }, - quantity: 4, - gravityY: 0, - scale: { start: 2, end: 0.1, ease: 'Power3' }, - blendMode: 'ADD', - active: false, - lifespan: CHARGE_LIFESPAN, - }); - this.add(particles); - this.scene.time.delayedCall(CHARGE_LIFESPAN, () => { emitter.stop(); }, [], this.scene); - this.scene.time.delayedCall(CHARGE_LIFESPAN * 2, () => { emitter2.active = true; }, [], this.scene); - this.scene.time.delayedCall(lifespan, () => { emitter2.stop(); }, [], this.scene); - } - - cleanup() { - this.children.entries.forEach(obj => obj.destroy()); - } -} - -module.exports = CombatSkills; diff --git a/phaser-client/src/scenes/combat.cryps.js b/phaser-client/src/scenes/combat.cryps.js deleted file mode 100644 index 6616a5b4..00000000 --- a/phaser-client/src/scenes/combat.cryps.js +++ /dev/null @@ -1,239 +0,0 @@ -const Phaser = require('phaser'); -const genAvatar = require('./avatar'); -const StatBar = require('./elements/combat.statbar'); - -const { DELAYS, TEXT, POSITIONS: { COMBAT } } = require('./constants'); - -const CONSTRUCT_MARGIN = COMBAT.constructMargin(); -const TEXT_MARGIN = COMBAT.textMargin(); - -const constructAvatarText = (team, iter) => { - const nameX = COMBAT.width() * team; - const nameY = COMBAT.y() + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; - const statusX = COMBAT.width() * team; - const statusY = COMBAT.y() + TEXT_MARGIN * 6 + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; - return { statusX, statusY, nameX, nameY }; -}; - -const constructEffects = (team, iter) => { - const constructEffectsX = team ? COMBAT.width() - COMBAT.width() / 6.5 : COMBAT.width() / 6.5; - const constructEffectsY = TEXT_MARGIN * 2 + CONSTRUCT_MARGIN * iter; - return { constructEffectsX, constructEffectsY }; -}; - -const constructPosition = (team, iter) => { - const constructAvatarX = team ? COMBAT.width() - COMBAT.width() / 6 : COMBAT.width() / 6; - const constructAvatarY = TEXT_MARGIN * 5 + CONSTRUCT_MARGIN * iter; - return { constructAvatarX, constructAvatarY }; -}; - - -class Effects extends Phaser.GameObjects.Group { - constructor(scene, team, iter) { - super(scene); - this.scene = scene; - const { constructEffectsX, constructEffectsY } = constructEffects(team, iter); - this.x = constructEffectsX; this.y = constructEffectsY; - this.effectCount = 0; - } - - addEffect(effect) { - const y = this.y + this.effectCount * TEXT_MARGIN; - const text = `${effect.effect} for ${effect.duration} turn`; - const e = this.scene.add.text(this.x, y, text, TEXT.NORMAL); - e.effect = effect.effect; - this.add(e); - this.effectCount += 1; - } - - removeEffect(effect) { - this.children.entries.forEach((e) => { - if (e.effect === effect) e.destroy(); - }); - } - - update(effects) { - this.effectCount = 0; - this.children.entries.forEach(e => e.destroy()); - effects.forEach((effect) => { - this.addEffect(effect); - }); - return true; - } -} - -class ConstructImage extends Phaser.GameObjects.Image { - constructor(scene, team, iter, construct) { - // Get coords - const { constructAvatarX, constructAvatarY } = constructPosition(team, iter); - const { statusX, statusY, nameX, nameY } = constructAvatarText(team, iter); - - // Construct display - // const avatar = team ? 'magmar' : 'alk'; - super(scene, constructAvatarX, constructAvatarY, 'aztec', genAvatar(construct.name)); - this.setScale(0.5); - - if (!team) this.flipX = true; - - // Save position and construct details - this.scene = scene; - this.iter = iter; - this.team = team; - this.construct = construct; - this.state = 'deselect'; - // Add construct name - scene.add.text(nameX, nameY, construct.name, TEXT.NORMAL).setOrigin(team, 0); - // Add construct stat bars - this.health = scene.add.existing(new StatBar(scene, this, 'HP')); - this.red_shield = scene.add.existing(new StatBar(scene, this, 'Red Shield')); - this.blue_shield = scene.add.existing(new StatBar(scene, this, 'Blue Shield')); - // this.evasion = scene.add.existing(new StatBar(scene, this, 'Evasion')); - - this.effects = scene.add.existing(new Effects(scene, team, iter)); - this.statusText = scene.add.text(statusX, statusY, '', TEXT.NORMAL); - } - - select() { - this.setTint('0x00bb00'); - this.state = 'select'; - } - - setKo() { - this.state = 'ko'; - this.setTint('0x9d9ea0'); - } - - deselect() { - if (this.state !== 'ko') { - this.clearTint(); - this.state = 'deselect'; - } - } - - clearStatus() { - this.statusText.text = ''; - } - - reduceDefense(amount, type) { - if (type === 'PhysDmg') { - this.red_shield.takeDamage(amount); - } else if (type === 'BlueDmg') { - this.blue_shield.takeDamage(amount); - } - } - - takeDamage(props) { - const { amount, mitigation, category } = props; - if (mitigation) this.reduceDefense(mitigation, category); - this.setTint(0xff0000); - this.health.takeDamage(amount); - this.scene.time.delayedCall(DELAYS.DAMAGE_TICK, () => { - if (this.state !== 'ko') this.clearTint(); - }); - } - - takeHealing(amount) { - this.setTint(0x00bb00); - this.health.takeDamage(amount * -1); - this.scene.time.delayedCall(DELAYS.DAMAGE_TICK, () => { - if (this.state !== 'ko') this.clearTint(); - }); - } -} - -class CombatConstructs extends Phaser.Scene { - constructor() { - super({ key: 'CombatConstructs' }); - } - - create(game) { - this.constructs = this.add.group(); - this.phase = game.phase; - this.account = this.registry.get('account'); - this.drawConstructs(game); - this.registry.events.on('changedata', this.updateData, this); - this.registry.set('constructStatusUpdate', false); - this.teams = game.teams.length; - } - - updateData(parent, key, data) { - if (key === 'game' && data) { - if (data.teams.length !== this.teams) this.scene.restart(data); - const isAnimating = this.phase === 'animating'; - this.game = data; - if (isAnimating) return false; - } - - if (key === 'gamePhase' && data) { - const shouldUpdate = data !== this.phase; - this.phase = data; - if (shouldUpdate) { - this.constructs.children.entries.forEach(c => c.clearStatus()); - this.drawConstructs(this.game); - } - } - - if (key === 'constructStatusUpdate' && data) { - this.updateConstructStatus(data); - } - - return true; - } - - drawConstructs(game) { - const renderConstruct = (construct, iter, team) => { - // Add Image Avatar Class - const constructObj = new ConstructImage(this, team, iter, construct); - this.add.existing(constructObj); - this.constructs.add(constructObj); - return constructObj; - }; - - const renderTeam = (construct, iter, team) => { - const constructObj = this.constructs.children.entries - .find(c => c.construct.id === construct.id) - || renderConstruct(construct, iter, team); - constructObj.health.val = construct.hp.value; - constructObj.red_shield.val = construct.red_shield.value; - constructObj.blue_shield.val = construct.red_shield.value; - - constructObj.health.drawStatBar(); - constructObj.red_shield.drawStatBar(); - constructObj.blue_shield.drawStatBar(); - constructObj.effects.update(construct.effects); - }; - - const allyTeam = game.teams.find(t => t.id === this.account.id); - // in future there will be more than one - const [enemyTeam] = game.teams.filter(t => t.id !== this.account.id); - - allyTeam.constructs.forEach((construct, i) => renderTeam(construct, i, 0)); - if (!enemyTeam) return false; - enemyTeam.constructs.forEach((construct, i) => renderTeam(construct, i, 1)); - return true; - } - - selectConstruct(constructId) { - this.constructs.children.entries.forEach(c => c.deselect()); - if (constructId) this.constructs.children.entries.find(c => c.construct.id === constructId).select(); - } - - updateConstructStatus(status) { - const sourceConstruct = this.constructs.children.entries - .find(c => c.construct.id === status.id); - - const targetConstruct = this.constructs.children.entries - .find(c => c.construct.id === status.target); - - if (this.phase === 'Skill') { - sourceConstruct.statusText.text = `${status.skill} on ${targetConstruct.construct.name}`; - } - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData); - this.scene.remove(); - } -} - -module.exports = CombatConstructs; diff --git a/phaser-client/src/scenes/combat.hitbox.js b/phaser-client/src/scenes/combat.hitbox.js deleted file mode 100644 index 868fe5ce..00000000 --- a/phaser-client/src/scenes/combat.hitbox.js +++ /dev/null @@ -1,89 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { COMBAT } } = require('./constants'); - -const CONSTRUCT_MARGIN = COMBAT.constructMargin(); -const BOX_HEIGHT = CONSTRUCT_MARGIN * 0.8; -const BOX_WIDTH = COMBAT.width() * 0.2; - - -class ConstructHitBox extends Phaser.GameObjects.Rectangle { - constructor(scene, iter, team, cback) { - const y = COMBAT.y() + COMBAT.height() * 0.05 + CONSTRUCT_MARGIN * iter; - super(scene, (COMBAT.width() - BOX_WIDTH) * team, y, BOX_WIDTH, BOX_HEIGHT, 0x222222); - this.setOrigin(0); - this.clickHandler = () => cback(); - } - - select() { - this.setFillStyle(0x003300); - } - - deselect() { - this.setFillStyle(0x222222); - } -} - -class CombatHitBox extends Phaser.Scene { - constructor() { - super({ key: 'CombatHitBox' }); - } - - create(phase) { - this.phase = phase; - this.registry.events.off('changedata', this.updateData); - this.registry.events.on('changedata', this.updateData, this); - if (phase === 'animating') return true; - this.selectHitBox(phase); - return true; - } - - updateData(parent, key, data) { - if (key === 'game' && data) { - // In the case that we hit skill phase but teams change we restart - if (data.teams.length !== this.teams) this.scene.restart(data.phase); - } - if (key === 'gamePhase' && data) { - const shouldUpdate = data !== this.phase; - if (shouldUpdate) this.scene.restart(data); - return false; - } - return true; - } - - selectHitBox(phase) { - const game = this.registry.get('game'); - this.teams = game.teams.length; - if (phase === 'Skill') return this.skillHitBox(game); - return false; - } - - skillHitBox(game) { - const account = this.registry.get('account'); - const group = this.scene.get('CombatConstructs').constructs; - const skillScene = this.scene.get('CombatSkills'); - game.teams.forEach((t) => { - t.constructs.forEach((c) => { - const cback = () => { - const { activeSkill } = skillScene; - if (activeSkill) { - this.scene.get('CombatSkills').clearConstructActive(activeSkill.construct.id); - activeSkill.activate(); - skillScene.activeSkill = null; - this.game.events.emit('SEND_SKILL', game.id, activeSkill.construct.id, c.id, activeSkill.skill.skill); - } - }; - const constructSpawn = group.children.entries.find(s => s.construct.id === c.id); - const team = c.account === account.id ? 0 : 1; - if (constructSpawn) this.add.existing(new ConstructHitBox(this, constructSpawn.iter, team, cback)); - }); - }); - this.scene.moveBelow('Combat'); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData); - this.scene.remove(); - } -} - -module.exports = CombatHitBox; diff --git a/phaser-client/src/scenes/combat.js b/phaser-client/src/scenes/combat.js deleted file mode 100644 index 1c520c60..00000000 --- a/phaser-client/src/scenes/combat.js +++ /dev/null @@ -1,138 +0,0 @@ -const Phaser = require('phaser'); -const { throttle } = require('lodash'); - -const { TEXT, POSITIONS: { COMBAT } } = require('./constants'); -const CombatLog = require('./combat.log'); -const CombatConstructs = require('./combat.constructs'); -const CombatSkills = require('./combat.skills'); -const CombatHitBox = require('./combat.hitbox'); - -const renderResolutions = require('./combat.render.resolutions'); - - -class Combat extends Phaser.Scene { - constructor() { - super({ key: 'Combat' }); - } - - preload() { - this.load.image('proj', 'https://labs.phaser.io/assets/sprites/bullet.png'); - this.load.image('blue', 'https://labs.phaser.io/assets/particles/blue.png'); - this.load.image('green', 'https://labs.phaser.io/assets/particles/green.png'); - this.load.image('red', 'https://labs.phaser.io/assets/particles/red.png'); - this.load.image('white', 'https://labs.phaser.io/assets/particles/white.png'); - this.load.image('yellow', 'https://labs.phaser.io/assets/particles/yellow.png'); - } - - create() { - console.log('creating game'); - this.registry.events.off('changedata', this.updateData); - this.registry.events.on('changedata', this.updateData, this); - this.addLeaveGame(); - - this.registry.set('gamePhase', false); - this.registry.set('inGame', true); - this.registry.set('gameAnimating', false); - this.account = this.registry.get('account'); - this.fetchGame = throttle(() => { - const game = this.registry.get('game'); - if (game) { - const ws = this.registry.get('ws'); - return ws.sendGameState(game.id); - } - return false; - }, 500); - - return true; - } - - startGame(game) { - this.scene.manager.add('CombatConstructs', CombatConstructs, true, game); - this.scene.manager.add('CombatLog', CombatLog, true, game); - this.renderedResolves = game.resolved.length; // In case you rejoin mid way - this.scene.manager.add('CombatSkills', CombatSkills, true, game.phase); - this.scene.manager.add('CombatHitBox', CombatHitBox, true, game.phase); - this.registry.set('gamePhase', game.phase); - this.phase = game.phase; - return true; - } - - update() { - this.fetchGame(); - return true; - } - - updateData(parent, key, data) { - if (key === 'game') { - if (!data) return false; - const startGame = this.registry.get('gamePhase') === false; - if (startGame) { this.startGame(data); return true; } - this.checkAnimation(data); - // Game over? - // if (data.phase === 'Finish') { - // this.time.delayedCall(10000, () => { - // this.endGame(); - // }); - // } - } - return true; - } - - checkAnimation(game) { - // Check constructs are loaded and whether game is animating - const cantAnimate = this.registry.get('gamePhase') === 'animating'; - if (cantAnimate) return false; - if (game.resolved.length !== this.renderedResolves) { - const newResolutions = game.resolved.slice(this.renderedResolves); - renderResolutions(this, game, newResolutions); - this.renderedResolves = game.resolved.length; - return true; - } - if (this.phase !== game.phase) { - this.phase = game.phase; - this.registry.set('gamePhase', game.phase); - } - if (this.registry.get('gameLog') !== game.log.length) { - this.registry.set('gameLog', game.log.length); - } - return true; - } - - addLeaveGame() { - const leaveGame = () => this.cleanUp(); - this.input.keyboard.on('keydown_BACKSPACE', leaveGame, 0, this); - const LEAVE_HEIGHT = COMBAT.height() / 6; - const LEAVE_WIDTH = COMBAT.width() / 5; - const LEAVE_X = COMBAT.width() * 0.8; - const LEAVE_Y = COMBAT.height() * 0.9; - - const menu = this.add - .rectangle(LEAVE_X, LEAVE_Y, LEAVE_WIDTH, LEAVE_HEIGHT, 0x440000) - .setInteractive() - .setOrigin(0) - .on('pointerdown', leaveGame); - - this.add - .text(menu.getCenter().x, menu.getCenter().y, 'Menu', TEXT.HEADER) - .setOrigin(0.5, 0.5); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - - this.registry.set('inGame', null); - this.registry.set('menu', true); - this.registry.set('game', null); - - const ACTIVE_SCENES = ['CombatLog', 'CombatConstructs', 'CombatSkills', 'CombatHitBox']; - ACTIVE_SCENES.forEach((sKey) => { - if (this.scene.get(sKey)) this.scene.get(sKey).cleanUp(); - }); - this.scene.remove(); - - return true; - } -} - -module.exports = Combat; diff --git a/phaser-client/src/scenes/combat.log.js b/phaser-client/src/scenes/combat.log.js deleted file mode 100644 index 7b353ef4..00000000 --- a/phaser-client/src/scenes/combat.log.js +++ /dev/null @@ -1,50 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { COMBAT }, TEXT } = require('./constants'); - -class CombatLog extends Phaser.Scene { - constructor() { - super({ key: 'CombatLog' }); - } - - create(game) { - this.registry.events.on('changedata', this.updateData, this); - this.cameras.main.setViewport(COMBAT.LOG.x(), COMBAT.LOG.y(), COMBAT.LOG.width(), COMBAT.LOG.height()); - this.log = this.add.text(0, 0, '', TEXT.NORMAL); - this.logIndex = game.log.length; - this.logData = game.log; - this.log.setWordWrapWidth(COMBAT.LOG.width()); - this.log.setText(Array.from(game.log).reverse()); - } - - updateData(parent, key, data) { - const UPDATE_KEYS = ['game', 'gameLog']; - if (UPDATE_KEYS.includes(key) && data) { - if (key === 'game') { - this.logData = data.log; - } - if (key === 'gameLog') { - this.logIndex = data; - } - this.updateLog(); - } - return true; - } - - updateLog() { - // shallow copy because reverse mutates - if (this.logData.length > this.logIndex + 1 - && Array.from(this.logData)[this.logIndex].slice(-2) === 'KO') { - this.logIndex += 1; - this.registry.set('gameLog', this.logIndex); - } - // } - this.log.setText(Array.from(this.logData).slice(0, this.logIndex).reverse()); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData); - this.scene.remove(); - } -} - -module.exports = CombatLog; diff --git a/phaser-client/src/scenes/combat.render.resolutions.js b/phaser-client/src/scenes/combat.render.resolutions.js deleted file mode 100644 index 77ceed62..00000000 --- a/phaser-client/src/scenes/combat.render.resolutions.js +++ /dev/null @@ -1,135 +0,0 @@ -const { eachSeries } = require('async'); - -const CombatAnimations = require('./combat.animations'); -const { - DELAYS: { ANIMATION_DURATION, MOVE_CREEP, DAMAGE_TICK }, - POSITIONS: { COMBAT }, -} = require('./constants'); - -function findResolutionConstructs(scene, group, resolution, game) { - const sourceSpawn = group.children.entries.find(c => c.construct.id === resolution.source.id); - -/* const sourceConstruct = game.teams.find(t => t.constructs.find(c => c.id === resolution.source_construct_id)) - .constructs.find(c => c.id === resolution.source_construct_id); - - const targetConstruct = game.teams.find(t => t.constructs.find(c => c.id === resolution.target_construct_id)) - .constructs.find(c => c.id === resolution.target_construct_id); -*/ - const targetSpawn = group.children.entries.find(c => c.construct.id === resolution.target.id); - - return { sourceSpawn, targetSpawn }; -} - -function calculateTweenParams(sourceSpawn, targetSpawn, account, skill) { - const tweenParams = (targets, centreSpot) => { - const enemy = targets.construct.account !== account.id; - let x = centreSpot ? COMBAT.width() * 0.3 : targets.x; - x = (enemy && centreSpot) ? x + COMBAT.width() * 0.4 : x; - const y = centreSpot ? COMBAT.height() * 13.25 / 35 : targets.y; - const ease = 'Power1'; - const duration = MOVE_CREEP; - return { - targets, x, y, ease, duration, - }; - }; - let moveSourceBattle = false; - let moveSourceOrig = false; - const targetOnlySkill = ['DecayTick']; - if (!(targetOnlySkill.includes(skill))) { - if (sourceSpawn.construct.account !== targetSpawn.construct.account) { - moveSourceBattle = tweenParams(sourceSpawn, true); - moveSourceOrig = tweenParams(sourceSpawn, false); - } - } - - const moveTargetBattle = tweenParams(targetSpawn, true); - const moveTargetOrig = tweenParams(targetSpawn, false); - - return { - moveSourceBattle, moveSourceOrig, moveTargetBattle, moveTargetOrig, - }; -} - -function animatePhase(scene, game, resolution, cb) { - // return early for disabled skills - if (resolution.length === 0) return cb(); - if (resolution.event[0] === 'Disable' - || resolution.event[0] === 'TargetKo' - || resolution.event === 'Ko') return cb(); - - const group = scene.scene.get('CombatConstructs').constructs; - const animations = new CombatAnimations(scene); - const account = scene.registry.get('account'); - - // Find constructs, targets - const { sourceSpawn, targetSpawn } = findResolutionConstructs(scene, group, resolution, game); - const { - moveSourceBattle, moveSourceOrig, moveTargetBattle, moveTargetOrig, - } = calculateTweenParams(sourceSpawn, targetSpawn, account, resolution.event[1].skill); - - const castParams = () => { - const x = (sourceSpawn === targetSpawn) ? moveTargetBattle.x : sourceSpawn.x; - const y = (sourceSpawn === targetSpawn) ? moveTargetBattle.y : sourceSpawn.y; - return { x, y }; - }; - const castLocation = castParams(); - - // Move constructs into position - if (moveSourceBattle) scene.tweens.add(moveSourceBattle); - scene.tweens.add(moveTargetBattle); - - return scene.time.delayedCall(MOVE_CREEP, () => { - const sourceAlly = sourceSpawn.construct.account === account.id; - const targetAlly = targetSpawn.construct.account === account.id; - // animate animation - animations.getSkill(resolution.event[1].skill, sourceAlly, targetAlly, castLocation); - // Target construct takes damage - scene.time.delayedCall(ANIMATION_DURATION, () => { - console.log(resolution); - if (resolution.event[0] === 'Damage') { - targetSpawn.takeDamage(resolution.event[1]); - scene.registry.set('gameLog', scene.registry.get('gameLog') + 1); - } - if (resolution.event[0] === 'Healing') { - targetSpawn.takeHealing(resolution.event[1]); - scene.registry.set('gameLog', scene.registry.get('gameLog') + 1); - } - if (resolution.event[0] === 'Effect') { - targetSpawn.effects.addEffect(resolution.event[1]); - console.log('target has new effect', resolution.event[1].effect); - } - - if (resolution.event[0] === 'Removal') { - targetSpawn.effects.removeEffect(resolution.event[1].effect); - console.log('target effect removed', resolution.event[1].effect); - } - if (moveSourceOrig) scene.tweens.add(moveSourceOrig); - scene.tweens.add(moveTargetOrig); - - // all done - scene.time.delayedCall(MOVE_CREEP, () => { - animations.destroy(true); - return cb(); - }); - }); - }); -} - -function renderResolutions(scene, game, resolutions) { - scene.registry.set('gamePhase', 'animating'); - scene.registry.set('gameLog', scene.registry.get('gameLog') + 1); - - eachSeries( - resolutions, - (resolution, cb) => animatePhase(scene, game, resolution, cb), - (err) => { - if (err) return console.error(err); - scene.registry.set('gamePhase', 'Skill'); - return true; - } - ); - - return true; -} - -module.exports = renderResolutions; diff --git a/phaser-client/src/scenes/combat.skills.js b/phaser-client/src/scenes/combat.skills.js deleted file mode 100644 index 7b0ac765..00000000 --- a/phaser-client/src/scenes/combat.skills.js +++ /dev/null @@ -1,235 +0,0 @@ -const Phaser = require('phaser'); - -const { TEXT, POSITIONS: { COMBAT } } = require('./constants'); - -const CONSTRUCT_KEY_MAP = ['keydown_ONE', 'keydown_TWO', 'keydown_THREE']; -const SKILL_KEY_MAP = ['keydown_Q', 'keydown_W', 'keydown_E', 'keydown_R']; -const TARGET_KEY_MAP = ['keydown_SEVEN', 'keydown_EIGHT', 'keydown_NINE', 'keydown_ZERO']; - -const CONSTRUCT_MARGIN = COMBAT.constructMargin(); -const TEXT_MARGIN = COMBAT.textMargin(); -const SKILL_WIDTH = COMBAT.width() / 10; -const SKILL_HEIGHT = COMBAT.height() / 30; - -const skillPosition = (constructIter, skillIter) => { - const skillTextX = COMBAT.width() / 3.8; - const skillTextY = (TEXT_MARGIN * skillIter) * 1.5 + CONSTRUCT_MARGIN * constructIter + COMBAT.y() + COMBAT.height() * 0.07; - return [skillTextX, skillTextY]; -}; - -const skillCheckHitBox = (scenePlugin, pointer) => { - const { list } = scenePlugin.get('CombatHitBox').children; - for (let i = 0; i < list.length; i += 1) { - if (Phaser.Geom.Rectangle.ContainsPoint(list[i].getBounds(), - pointer.position)) return list[i]; - } - // If we didn't find a hitbox deselect them all - for (let i = 0; i < list.length; i += 1) list[i].deselect(); - return false; -}; - -class ConstructSkill extends Phaser.GameObjects.Container { - constructor(scene, x, y, skill, construct) { - // Avatar will be a property of construct - super(scene, x, y); - const CD_TEXT = skill.cd ? `(${skill.cd}T)` : ''; - const SKILL_TEXT = `${skill.skill} ${CD_TEXT}`; - this.origX = x; this.origY = y; - - this.skillBox = scene.add.rectangle(0, 0, SKILL_WIDTH, SKILL_HEIGHT, 0x222222); - this.skillText = scene.add.text(0, 0, SKILL_TEXT, TEXT.NORMAL).setOrigin(0.5, 0.5); - this.add(this.skillBox); - this.add(this.skillText); - - this.state = 'deselect'; - this.construct = construct; - this.skill = skill; - this.scene = scene; - - this.setSize(SKILL_WIDTH, SKILL_HEIGHT); - this.setInteractive(); - } - - clickHandler() { - if (this.scene.phase === 'Skill') this.scene.activeSkill = this; - this.select(); - } - - select() { - this.scene.children.list.forEach((skill) => { - if (skill.state === 'select') skill.deselect(); - }); - this.skillBox.setFillStyle(0x004bfe); - this.state = 'select'; - } - - activate() { - this.scene.children.list.forEach((skill) => { - if (skill.state === 'select') skill.deselect(); - }); - this.skillBox.setFillStyle(0xff0000); - this.state = 'activate'; - } - - deselect() { - this.skillBox.setFillStyle(0x222222); - this.state = 'deselect'; - } -} - -class CombatSkills extends Phaser.Scene { - constructor() { - super({ key: 'CombatSkills' }); - } - - create(phase) { - this.phase = phase; - this.registry.events.off('changedata', this.updateData); - this.registry.events.on('changedata', this.updateData, this); - this.account = this.registry.get('account'); - - this.input.on('dragstart', (pointer, box) => { - box.clickHandler(); - }); - this.input.on('drag', (pointer, box, dragX, dragY) => { - const hitBox = skillCheckHitBox(this.scene, pointer); - if (hitBox) hitBox.select(); - box.setPosition(dragX, dragY); - }); - this.input.on('dragend', (pointer, box) => { - box.deselect(); - const hitBox = skillCheckHitBox(this.scene, pointer); - if (hitBox) { - hitBox.clickHandler(); - } - box.setPosition(box.origX, box.origY); - }); - - if (phase === 'animating') return true; - // can't set this.game cause of phaser class named the same - const game = this.registry.get('game'); - this.renderSkills(game, phase); - - return true; - } - - updateData(parent, key, data) { - if (key === 'gamePhase' && data) { - const shouldUpdate = data !== this.phase; - if (shouldUpdate) { - this.scene.get('CombatConstructs').selectConstruct(null); - return this.scene.restart(data); - } - return false; - } - return true; - } - - renderSkills(game, phase) { - if (phase === 'Skill') return this.renderSkillPhase(game); - return false; - } - - renderSkillPhase(game) { - const { account } = this; - const { keyboard } = this.input; - const { events } = this.game; - - const addSkill = (i, j, skill, construct) => { - const skillTextPos = skillPosition(i, j); - const skillObj = new ConstructSkill(this, skillTextPos[0], skillTextPos[1], skill, construct); - if (skill.cd) { - skillObj.skillBox.setFillStyle(0x9d9ea0); - } else { - this.input.setDraggable(skillObj); - } - this.add.existing(skillObj); - return skillObj; - }; - - const team = game.teams.find(t => t.id === account.id); - const enemyTeam = game.teams.find(t => t.id !== account.id); - - team.constructs.forEach((construct) => { - // return early if KOd - if (construct.hp.value === 0) return true; - - // find the construct position - const { iter } = this.scene.get('CombatConstructs').constructs.children.entries.find(c => c.construct.id === construct.id); - - // draw the skills - const skillButtons = construct.skills.map((skill, j) => addSkill(iter, j, skill, construct)); - - const bindConstructKeys = () => this.mapSkillKeys(skillButtons, game.id, construct.id, team.id, enemyTeam.id, iter); - - // reset everything - keyboard.on('keydown_ESC', bindConstructKeys, this); - events.on('SEND_SKILL', bindConstructKeys, this); - bindConstructKeys(); - - return true; - }); - - return true; - } - - // FIXME - // needs to send constructId not team - mapSkillKeys(skillButtons, gameId, constructId, alliesId, enemyId, i) { - const { keyboard } = this.input; - - keyboard.removeListener(CONSTRUCT_KEY_MAP[i]); - - keyboard.on(CONSTRUCT_KEY_MAP[i], () => { - SKILL_KEY_MAP.forEach(k => keyboard.removeListener(k)); - - this.scene.get('CombatConstructs').selectConstruct(constructId); - - skillButtons.forEach((button, j) => { - keyboard.on(SKILL_KEY_MAP[j], () => { - this.activeSkill = button; - button.select(); - - // clear existing keys - CONSTRUCT_KEY_MAP.forEach(k => keyboard.removeListener(k)); - TARGET_KEY_MAP.forEach(k => keyboard.removeListener(k)); - - CONSTRUCT_KEY_MAP.forEach(k => keyboard.on(k, () => { - this.clearConstructActive(constructId); - button.activate(); - this.activeSkill = null; - this.game.events.emit('SEND_SKILL', gameId, constructId, alliesId, button.skill.skill); - })); - - TARGET_KEY_MAP.forEach(k => keyboard.on(k, () => { - this.clearConstructActive(constructId); - button.activate(); - this.activeSkill = null; - this.game.events.emit('SEND_SKILL', gameId, constructId, enemyId, button.skill.skill); - })); - }, this); - }); - }, this); - - return true; - } - - clearConstructActive(constructId) { - this.scene.scene.children.list.forEach((s) => { - if (s.construct.id === constructId && s.state === 'activate') s.deselect(); - }); - } - - clearKeys() { - TARGET_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); - CONSTRUCT_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); - SKILL_KEY_MAP.forEach(tKey => this.input.keyboard.removeListener(tKey)); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData); - this.scene.remove(); - } -} - -module.exports = CombatSkills; diff --git a/phaser-client/src/scenes/constants.js b/phaser-client/src/scenes/constants.js deleted file mode 100644 index ffe0b475..00000000 --- a/phaser-client/src/scenes/constants.js +++ /dev/null @@ -1,388 +0,0 @@ -// POSITIONING FNS -// floors prevent subpixel rendering which looks trash - -const CANVAS_WIDTH = () => Math.floor(window.innerHeight * 1.6); -const CANVAS_HEIGHT = () => Math.floor(window.innerHeight); - -const headerWidth = () => CANVAS_WIDTH(); -const headerHeight = () => Math.floor(CANVAS_HEIGHT() * 0.05); - -const menuConstructListWidth = () => Math.floor(CANVAS_WIDTH() * 0.3); -const menuConstructListHeight = () => Math.floor(CANVAS_HEIGHT() - headerHeight()); -const menuConstructListX = () => Math.floor(CANVAS_WIDTH() * 0.3); -const menuConstructListY = () => headerHeight(); - -const itemListWidth = () => Math.floor(CANVAS_WIDTH() * 0.5); -const itemListHeight = () => Math.floor(CANVAS_HEIGHT() * 0.95); -const itemListX = () => 0; -const itemListY = () => headerHeight(); -const itemBlockWidth = () => Math.floor(itemListWidth() * 0.12); -const itemBlockHeight = () => Math.floor(itemListHeight() * 0.04); - -const menuNavigationWidth = () => Math.floor(CANVAS_WIDTH() * 0.5); -const menuNavigationHeight = () => Math.floor(CANVAS_HEIGHT() * 0.3); -const menuNavigationX = () => Math.floor(CANVAS_WIDTH() * 0.5); -const menuNavigationY = () => Math.floor(CANVAS_HEIGHT() * 0.7); - -const menuMainWidth = () => Math.floor(CANVAS_WIDTH() * 0.4); -const menuMainHeight = () => Math.floor(CANVAS_HEIGHT() * 0.5); -const menuMainX = () => Math.floor(CANVAS_WIDTH() * 0.65); -const menuMainY = () => headerHeight(); - -const homeMainWidth = () => Math.floor(CANVAS_WIDTH() * 0.6); -const homeMainHeight = () => Math.floor(CANVAS_HEIGHT() * 0.5); -const homeMainX = () => Math.floor(CANVAS_WIDTH() * 0.4); -const homeMainY = () => headerHeight(); - -const combatWidth = () => CANVAS_WIDTH(); -const combatHeight = () => CANVAS_HEIGHT() - headerHeight(); -const combatY = () => headerHeight(); -const combatX = () => 0; -const combatConstructMargin = () => Math.floor((CANVAS_HEIGHT() - headerHeight()) / 4.5); -const combatTextMargin = () => Math.floor((CANVAS_HEIGHT() - headerHeight()) / 35); - -const statsWidth = () => Math.floor(CANVAS_WIDTH() - menuConstructListWidth()); -const statsHeight = () => CANVAS_HEIGHT() - headerHeight(); -const statsY = () => headerHeight(); -const statsX = () => menuConstructListWidth(); -const statsKnownX = () => Math.floor(statsX() + statsWidth() / 4); -const statsLearnableX = () => Math.floor(statsX() + statsWidth() / 2); -const statsTextMargin = () => 24; -const statsLearnableMargin = () => 12; - -const logWidth = () => Math.floor(combatWidth() * 0.5); -const logHeight = () => Math.floor(combatHeight() * 0.3); -const logY = () => Math.floor(headerHeight() + (combatHeight() * 0.7)); -const logX = () => Math.floor(combatWidth() * 0.2); - - -module.exports = { - TEXT: { - NORMAL: { fontFamily: 'Jura', fontSize: 18, color: '#ffffff' }, - LEARNABLE: { fontFamily: 'Jura', fontSize: 18, color: '#ffffff' }, - HEADER: { fontFamily: 'Jura', fontSize: 24, color: '#ffffff', fontStyle: 'bold' }, - HOVER: { fontFamily: 'Jura', fontSize: 16, color: '#ffffff', backgroundColor: '#222222' }, - }, - - POSITIONS: { - HEADER: { - width: headerWidth, - height: headerHeight, - }, - - CONSTRUCT_LIST: { - x: menuConstructListX, - y: menuConstructListY, - width: menuConstructListWidth, - height: menuConstructListHeight, - }, - - MENU_MAIN: { - x: menuMainX, - y: menuMainY, - width: menuMainWidth, - height: menuMainHeight, - - }, - - HOME_MAIN: { - x: homeMainX, - y: homeMainY, - width: homeMainWidth, - height: homeMainHeight, - - }, - - - NAVIGATION: { - x: menuNavigationX, - y: menuNavigationY, - width: menuNavigationWidth, - height: menuNavigationHeight, - }, - - ITEM_LIST: { - x: itemListX, - y: itemListY, - width: itemListWidth, - height: itemListHeight, - itemWidth: itemBlockWidth, - itemHeight: itemBlockHeight, - - }, - - STATS: { - x: statsX, - y: statsY, - width: statsWidth, - height: statsHeight, - knownX: statsKnownX, - learnableX: statsLearnableX, - textMargin: statsTextMargin, - learnableMargin: statsLearnableMargin, - }, - - COMBAT: { - x: combatX, - y: combatY, - width: combatWidth, - height: combatHeight, - constructMargin: combatConstructMargin, - textMargin: combatTextMargin, - - - LOG: { - x: logX, - y: logY, - width: logWidth, - height: logHeight, - }, - }, - }, - - COLOURS: { - BLUE: 0x004bfe, - CYAN: 0x27e7c0, - PURPLE: 0x61008c, - YELLOW: 0xfdfe02, - ORANGE: 0xff9215, - PINK: 0xe766b6, - GRAY: 0x9d9ea0, - LBLUE: 0x87c6f2, - GREEN: 0x166c4f, - BROWN: 0x583108, - BLACK: 0x000000, - RED: 0xff0000, - WHITE: 0xffffff, - - SELECT: 0x003300, - }, - - DELAYS: { - MOVE_CREEP: 500, - DAMAGE_TICK: 500, - ANIMATION_DURATION: 1000, - // wall: [500], - // spit: [300, 500], - // gravBomb: [300, 500], - // gravBlast: [300, 500], - // chargeBall: [300, 500], - }, - - ITEMS: { - SKILLS: { - Amplify: { - description: 'increase the magic damage dealt by a construct', - colours: '1 Green 1 Blue', - }, - - Attack: { - description: 'a fast attack with red damage', - upgrades: 'combine with 2 red / blue / green - red + blue attack not implemented', - }, - - Banish: { - description: 'target construct is prevented from casting any skills and taking any damage', - colours: '1 Red 1 Green', - - }, - - Blast: { - description: 'blast the target with magic damage', - colours: '2 Blue', - }, - - Block: { - description: 'decreases incoming red damage for 1T', - upgrades: 'combine with 2 red / blue / green', - }, - - Buff: { - description: 'increase target construct speed', - upgrades: 'combine with 2 red / blue / green', - }, - - Clutch: { - description: '??????', - colours: '1 Red 1 Green', - }, - - Corrupt: { - description: 'Inflicts a dot to attacker while active', - colours: '2 Blue', - }, - - Curse: { - description: 'target construct takes increased magic damage', - colours: '2 Blue', - }, - - Debuff: { - description: 'reduce target construct speed', - upgrades: 'combine with 2 red / blue / green', - }, - - Decay: { - description: 'afflict a construct with a blue damage based damage over time debuff', - colours: '1 Green 1 Blue', - }, - - Empower: { - description: 'increase the red damage dealt by a construct', - colours: '2 Red', - }, - - Haste: { - description: 'magical skill that increases speed of target construct', - colours: '1 Red 1 Blue', - }, - - Heal: { - description: 'heal a construct with blue damage', - colours: '2 Green', - }, - - Hex: { - description: 'magical bsed skill that prevents target construct from using any skills', - colours: '1 Red 1 Blue', - }, - - Hostility: { - description: 'magical bsed skill that prevents target construct from using any skills', - colours: '2 Blue', - }, - - Invert: { - description: 'reverse ???', - colours: '1 Red 1 Blue', - }, - - Parry: { - description: 'prevents all red damage for 1T', - colours: '2 Red', - }, - - Purge: { - description: 'remove magical buffs from target construct', - colours: '2 Green', - }, - - Purify: { - description: 'remove magical debuffs from target construct', - colours: '1 Red 1 Green', - }, - - Recharge: { - description: 'restore something', - colours: '1 Red 1 Blue', - }, - - Reflect: { - description: 'reflect damage back to attacker', - colours: '2 Green', - }, - - Riposte: { - description: '???', - }, - - Ruin: { - description: 'Stun the entire enemy team', - colours: '2 Blue', - }, - - Shield: { - description: 'grants immunity to magical skills to target construct', - colours: '1 Green 1 Blue', - }, - - Silence: { - description: 'prevent target construct from casting magical skills', - colours: '1 Green 1 Blue', - }, - - Siphon: { - description: 'siphon hp from target construct with a blue damage based debuff', - colours: '1 Green 1 Blue', - }, - - Slay: { - description: '????', - }, - - Slow: { - description: 'magical skill that reduces speed of target construct', - colours: '1 Red 1 Green', - }, - - Snare: { - description: 'prevents red skills from being used for 2T', - colours: '2 Red', - }, - - Strangle: { - description: 'Stun the enemy and inflict physical damage over 3T', - colours: '2 Red', - }, - - Strike: { - description: 'Fast attacking red skill', - colours: '2 Red', - }, - - Stun: { - description: 'red skill hat prevents target construct from using any skills', - upgrades: 'combine with 2 red / blue / green', - - }, - - Taunt: { - description: 'Enemy skills will prioritise constructs with this skill active', - colours: '1 Red 1 Green', - }, - - Throw: { - description: 'stuns and makes the target take increased red damage', - colours: '2 Green', - }, - - Triage: { - description: 'grants a blue damage based healing over time buff', - colours: '2 Green', - }, - }, - - SPECS: { - Damage: { - description: 'Increase red / green / blue power stats construct', - upgrades: 'combine with 2 red / blue / green', - - }, - - Hp: { - description: 'Increases health of construct', - upgrades: 'combine with 2 red / blue / green', - - }, - - Speed: { - description: 'Increases speed of construct', - upgrades: 'combine with 2 red / blue / green', - }, - }, - - COLOURS: { - Red: { - description: 'Used to create offensive type combos - fast and chaotic', - }, - - Green: { - description: 'Used to create defensive / healing type combos', - }, - - Blue: { - description: 'Used to create offensive type combos - slow and reliable', - }, - }, - }, -}; diff --git a/phaser-client/src/scenes/cryps.js b/phaser-client/src/scenes/cryps.js deleted file mode 100644 index c1fd95e9..00000000 --- a/phaser-client/src/scenes/cryps.js +++ /dev/null @@ -1,77 +0,0 @@ -const Phaser = require('phaser'); - -const Header = require('./header'); -const Home = require('./home'); -const Menu = require('./menu'); -const Combat = require('./combat'); - -// const Background = require('./background'); - -function renderConstructs() { - const config = { - type: Phaser.CANVAS, - // backgroundColor: '#181818', - resolution: window.devicePixelRatio, - scale: { - mode: Phaser.Scale.FIT, - width: Math.floor(window.innerHeight * 1.6), - height: Math.floor(window.innerHeight), - max: { - width: Math.floor(window.innerHeight * 1.6), - height: Math.floor(window.innerHeight), - }, - - }, - antialias: true, - physics: { - default: 'arcade', - arcade: { - debug: false, - gravity: { y: 0 }, - }, - }, - scene: [ - // Background, - Header, - ], - }; - - const game = new Phaser.Game(config); - - - function changeData(parent, key, data) { - // Don't load other scenes if you're not logged in - if (!game.registry.get('account')) return false; - - if (key === 'home') { - if (data) return game.scene.add('Home', Home, true); - } - - if (key === 'menu') { - if (!data || game.registry.get('inMenu')) return false; - if (data) return game.scene.add('Menu', Menu, true); - } - - if (key === 'game') { - if (!data || game.registry.get('inGame')) return false; - return game.scene.add('Combat', Combat, true); - } - - return true; - } - - game.registry.events.on('changedata', changeData); - game.registry.events.on('setdata', changeData); - - window.addEventListener('mouseup', () => game.registry.set('pan', false)); - window.addEventListener('mousedown', () => game.registry.set('pan', true)); - window.addEventListener('resize', () => { - game.scale.displaySize.maxWidth = window.innerHeight * 1.6; - game.scale.displaySize.maxHeight = window.innerHeight; - }); - - - return game; -} - -module.exports = renderConstructs; diff --git a/phaser-client/src/scenes/elements/box.js b/phaser-client/src/scenes/elements/box.js deleted file mode 100644 index b95e6287..00000000 --- a/phaser-client/src/scenes/elements/box.js +++ /dev/null @@ -1,132 +0,0 @@ -const Phaser = require('phaser'); -const { TEXT } = require('.././constants'); - -const BOX = ` -#ifdef GL_ES -precision mediump float; -#endif - -#extension GL_OES_standard_derivatives : enable - -#ifdef GL_ES -precision mediump float; -#endif - -#extension GL_OES_standard_derivatives : enable - -uniform float time; -uniform vec2 resolution; -uniform vec2 dimensions; -uniform vec2 offset; -uniform vec3 colour; -uniform sampler2D uMainSampler; - - -varying vec2 outTexCoord; -varying vec4 outTint; - -float sdBox( in vec2 p, in vec2 b ) -{ - vec2 d = abs(p)-b; - return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0); -} - -void main() -{ - - vec2 p = (gl_FragCoord.xy / resolution.xy); - p.x -= offset.x / resolution.x + dimensions.x / (2.0 * resolution.x); - p.y -= -1.0 * offset.y / resolution.y + ((resolution.y - dimensions.y) / (2.0 * resolution.y)) + 0.5; - vec2 dim = 0.5 * dimensions / resolution.xy; - float d = sdBox(p, dim); - float tb = abs(sin(time)) + 0.9; - - vec3 col = tb * colour - sign(d) * vec3(0.1); - col *= 0.0 + exp(-100.0 * abs(d)); - col += colour * 0.8; - vec4 texel = texture2D(uMainSampler, outTexCoord); - texel *= vec4(outTint.rgb * outTint.a, outTint.a); - - gl_FragColor = vec4(col, 1.0); -} -`; - - -class CustomPipeline extends Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline { - constructor(game) { - super({ game, renderer: game.renderer, fragShader: BOX }); - } -} - -function rgbToHex(rgb) { - const getHex = (c) => { - const hex = Math.floor(c * 255).toString(16); - return hex.length === 1 ? `0${hex}` : hex; - }; - return `0x${getHex(rgb[0])}${getHex(rgb[1])}${getHex(rgb[2])}`; -} - - -class BoxEffect extends Phaser.GameObjects.Graphics { - constructor(scene, x, y, width, height, colour, tag) { - super(scene); - this.tag = tag; - this.customPipeline = scene.game.renderer.addPipeline(tag, new CustomPipeline(scene.game)); - this.customPipeline.setFloat2('resolution', 1600, 1000); - this.customPipeline.setFloat2('offset', x, y); - this.customPipeline.setFloat2('dimensions', width, height); - this.customPipeline.setFloat3('colour', colour[0], colour[1], colour[2]); - this.bgTime = 10.0; - - const radius = height / 2; - this.fillStyle(rgbToHex(colour), 1.0); - this.fillRect(x + radius, y, width - radius * 2, height); - this.fillCircle(x + radius, y + radius, radius); - this.fillCircle(x + width - radius, y + radius, radius); - - - this.on('destroy', () => { - scene.game.renderer.removePipeline(tag); - }); - } - - activate() { - this.setPipeline(this.tag); - } - - deactivate() { - this.resetPipeline(); - } - - update() { - this.bgTime += 0.05; - this.customPipeline.setFloat1('time', this.bgTime); - } -} - -class Button extends Phaser.GameObjects.Group { - constructor(scene, props) { - const { - x, y, width, height, colour, glTag, bText, callback, - } = props; - - super(scene, { classType: BoxEffect, runChildUpdate: true }); - - const leaveGame = scene.add - .rectangle(x, y, width, height, 0xaaaaaa, 0xffffff) - .setInteractive() - .setOrigin(0); - - const effect = scene.add.existing(new BoxEffect(scene, x, y, width, height, colour, glTag)); - this.add(effect); - - leaveGame - .on('pointerdown', callback) - .on('pointerover', () => effect.activate()) - .on('pointerout', () => effect.deactivate()); - - this.buttonText = scene.add.text(leaveGame.getCenter().x, leaveGame.getCenter().y, bText, TEXT.HEADER).setOrigin(0.5, 0.5); - } -} - -module.exports = Button; diff --git a/phaser-client/src/scenes/elements/combat.statbar.js b/phaser-client/src/scenes/elements/combat.statbar.js deleted file mode 100644 index c85d10a1..00000000 --- a/phaser-client/src/scenes/elements/combat.statbar.js +++ /dev/null @@ -1,86 +0,0 @@ -const Phaser = require('phaser'); -const { TEXT, POSITIONS: { COMBAT }, COLOURS } = require('.././constants'); - -const CONSTRUCT_MARGIN = COMBAT.constructMargin(); -const TEXT_MARGIN = COMBAT.textMargin(); - -const statBarDimensions = (team, iter, margin) => { - const statBarWidth = COMBAT.width() * 0.07; - const statBarHeight = TEXT_MARGIN / 1.5; - const statBarX = (COMBAT.width() - statBarWidth) * team; - const statBarY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; - return { statBarX, statBarY, statBarWidth, statBarHeight }; -}; - -const statTextCoord = (team, iter, margin) => { - const statTextX = team ? COMBAT.width() - COMBAT.width() * 0.075 : COMBAT.width() * 0.075; - const statTextY = COMBAT.y() + TEXT_MARGIN * (margin + 1) + CONSTRUCT_MARGIN * iter + COMBAT.height() * 0.07; - return { statTextX, statTextY }; -}; - - -class StatBar extends Phaser.GameObjects.Graphics { - constructor(scene, construct, type) { - super(scene); - this.constructObj = construct; - this.type = type; - - if (type === 'HP') { - this.val = this.constructObj.construct.hp.value; - this.max = this.constructObj.construct.hp.max; - this.margin = 0; - } else if (type === 'Red Shield') { - this.val = this.constructObj.construct.red_shield.value; - this.max = this.constructObj.construct.red_shield.max; - this.margin = 1; - } else if (type === 'Blue Shield') { - this.val = this.constructObj.construct.blue_shield.value; - this.max = this.constructObj.construct.blue_shield.max; - this.margin = 2; - } else if (type === 'Evasion') { - this.val = this.constructObj.construct.evasion.value; - this.max = this.constructObj.construct.evasion.max; - this.margin = 3; - } - const { statTextX, statTextY } = statTextCoord(construct.team, construct.iter, this.margin); - this.statText = scene.add.text(statTextX, statTextY, '', TEXT.NORMAL).setOrigin(construct.team, 0); - this.drawStatBar(); - } - - drawStatBar() { - this.clear(); - const { - statBarX, statBarY, statBarWidth, statBarHeight, - } = statBarDimensions(this.constructObj.team, this.constructObj.iter, this.margin); - this.statText.text = `${this.val.toString()} / ${this.max.toString()} ${this.type}`; - // Draw Black Border - this.fillStyle(COLOURS.BLACK); - this.fillRect(statBarX, statBarY, statBarWidth, statBarHeight); - // White fill - this.fillStyle(COLOURS.WHITE); - this.fillRect(statBarX + 2, statBarY + 2, statBarWidth - 4, statBarHeight - 4); - // Fill the health bar - const statPercentage = this.val / this.max; - if (statPercentage < 0.3) { - this.fillStyle(COLOURS.RED); - } else if (statPercentage < 0.65) { - this.fillStyle(COLOURS.YELLOW); - } else { - this.fillStyle(0x00ff00); // str8 up green - } - const statWidth = statBarWidth * statPercentage; - this.fillRect(statBarX + 2, statBarY + 2, statWidth, statBarHeight - 4); - } - - takeDamage(value) { - if (value > 0) { - this.val = (value >= this.val) ? 0 : this.val -= value; - } else { - this.val = (this.val - value > this.max) ? this.max : this.val -= value; - } - if (this.val === 0 && this.type === 'HP') this.constructObj.setKo(); - this.drawStatBar(); - } -} - -module.exports = StatBar; diff --git a/phaser-client/src/scenes/elements/item.js b/phaser-client/src/scenes/elements/item.js deleted file mode 100644 index 07e820b3..00000000 --- a/phaser-client/src/scenes/elements/item.js +++ /dev/null @@ -1,56 +0,0 @@ -const Phaser = require('phaser'); - -const { - TEXT, - COLOURS, -} = require('../constants'); - -function FindColour(item) { - // Future add skills and use a constants lookup file ?? - switch (item) { - case 'Green': return 0x396E26; - case 'Red': return 0x622433; - case 'Blue': return 0x223158; - // case 'Green': return 0x043003; - // case 'Red': return 0x5C0202; - // case 'Blue': return 0x040345; - - default: return 0x222222; - } -} - -class Item extends Phaser.GameObjects.Container { - constructor(scene, item, index, x, y, width, height) { - super(scene, x, y); - - this.scene = scene; - this.item = item; - this.index = index; - this.origX = x; - this.origY = y; - this.width = width; - this.height = height; - - this.colour = FindColour(item); - this.box = scene.add - .rectangle(0, 0, width, height, this.colour); - - this.text = scene.add - // .text(0, 0, `${action} x${count}`, TEXT.NORMAL) - .text(0, 0, `${item}`, TEXT.NORMAL) - .setOrigin(0.5, 0.5); - - this.add(this.box); - this.add(this.text); - - this.setSize(width, height); - this.setInteractive(); - } - - changeOrigin(x, y) { - this.origX = x + this.width / 2; - this.origY = y + this.height / 2; - } -} - -module.exports = Item; diff --git a/phaser-client/src/scenes/elements/outline.rotate.js b/phaser-client/src/scenes/elements/outline.rotate.js deleted file mode 100644 index 041611ee..00000000 --- a/phaser-client/src/scenes/elements/outline.rotate.js +++ /dev/null @@ -1,73 +0,0 @@ -const Phaser = require('phaser'); - -class LineBox extends Phaser.GameObjects.Graphics { - constructor(scene, x, y, width, height, colour, speed) { - super(scene); - this.colour = colour; - this.x0 = x; this.x1 = x + width; - this.y0 = y; this.y1 = y + height; - const margin = Math.abs(Math.floor((this.x1 - this.x0) / 4)); - this.lineCoord = [this.x0 + margin, this.x1 - margin, this.y0, this.y0, 0]; - this.speed = speed; - } - - update() { - this.clear(); - - let vertX = this.x1; - let horizY = this.y0; - const genLine = () => { - switch (this.lineCoord[4]) { - case 0: - if (this.lineCoord[1] < this.x1) return [1, 1, 0, 0, 0]; - return [0, 0, 0, 0, 1]; - case 1: - if (this.lineCoord[0] < this.x1) return [1, 0, 0, 1, 1]; - return [0, 0, 0, 0, 2]; - case 2: - if (this.lineCoord[3] < this.y1) return [0, 0, 1, 1, 2]; - return [0, 0, 0, 0, 3]; - case 3: - horizY = this.y1; - if (this.lineCoord[2] < this.y1) return [-1, 0, 1, 0, 3]; - return [0, 0, 0, 0, 4]; - case 4: - horizY = this.y1; - if (this.lineCoord[0] > this.x0) return [-1, -1, 0, 0, 4]; - return [0, 0, 0, 0, 5]; - case 5: - horizY = this.y1; - vertX = this.x0; - if (this.lineCoord[1] > this.x0) return [0, -1, -1, 0, 5]; - return [0, 0, 0, 0, 6]; - case 6: - vertX = this.x0; - if (this.lineCoord[2] >= this.y0) return [0, 0, -1, -1, 6]; - return [0, 0, 0, 0, 7]; - case 7: - vertX = this.x0; - if (this.lineCoord[3] >= this.y0) return [0, 1, 0, -1, 7]; - return [0, 0, 0, 0, 0]; - default: return false; - } - }; - for (let i = 0; i < this.speed; i += 1) { - const delta = genLine(); - this.lineCoord = this.lineCoord.map((x, j) => { - if (j < 4) return (x + delta[j]); - return delta[j]; - }); - } - this.lineStyle(5, this.colour, 1); - this.lineBetween(this.lineCoord[0], horizY, this.lineCoord[1], horizY); - this.lineBetween(vertX, this.lineCoord[2], vertX, this.lineCoord[3]); - } -} - -class LineGroup extends Phaser.GameObjects.Group { - constructor(scene) { - super(scene, { classType: LineBox, runChildUpdate: true }); - } -} - -module.exports = { LineGroup, LineBox } \ No newline at end of file diff --git a/phaser-client/src/scenes/game.list.js b/phaser-client/src/scenes/game.list.js deleted file mode 100644 index d436770b..00000000 --- a/phaser-client/src/scenes/game.list.js +++ /dev/null @@ -1,53 +0,0 @@ -const Phaser = require('phaser'); -const { TEXT, POSITIONS: { MENU_MAIN } } = require('./constants'); - -const X = MENU_MAIN.x(); -const Y = MENU_MAIN.y(); -const WIDTH = MENU_MAIN.width(); -const HEIGHT = MENU_MAIN.height(); -const ROW_SIZE = 50; -const LOBBY_WIDTH = WIDTH / 2; - -class GameList extends Phaser.Scene { - constructor() { - super({ key: 'GameList' }); - } - - create(gameList) { - this.cameras.main.setViewport(X, Y, WIDTH, HEIGHT); - const ws = this.registry.get('ws'); - - this.add.text(WIDTH / 3, 0, 'PVP open games', TEXT.HEADER); - const gameRow = (game, i) => { - const GAME_X = WIDTH / 6; - const GAME_Y = 1.3 * ROW_SIZE * (i + 1); - - const gameBox = this.add - .rectangle(GAME_X, GAME_Y, LOBBY_WIDTH, ROW_SIZE, 0x222222) - .setInteractive() - .setOrigin(0); - - const TITLE = `${game.teams[0].constructs.map(c => c.name).join(', ')} - ${game.team_size}v${game.team_size}`; - - this.add - .text(gameBox.getCenter().x, gameBox.getCenter().y, TITLE, TEXT.NORMAL) - .setOrigin(0.5, 0.5); - - gameBox.on('pointerdown', () => { - const constructs = this.registry.get('constructs'); - const team = constructs.filter(c => c.active).map(c => c.id); - ws.sendGameJoin(game.id, team); - }); - }; - - gameList.forEach(gameRow); - - return true; - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = GameList; diff --git a/phaser-client/src/scenes/header.js b/phaser-client/src/scenes/header.js deleted file mode 100644 index c6c31c05..00000000 --- a/phaser-client/src/scenes/header.js +++ /dev/null @@ -1,27 +0,0 @@ -const Phaser = require('phaser'); -const fs = require('fs'); - -const { TEXT } = require('./constants'); - -const aztecAtlas = require('../../assets/aztec.atlas.json'); - - -class Header extends Phaser.Scene { - constructor() { - super({ key: 'Header', active: true }); - } - - preload() { - const aztecImg = new Image(); - aztecImg.src = `data:image/png;base64,${new Buffer.from(fs.readFileSync('./assets/aztec.clean.png')).toString('base64')}`; - aztecImg.onload = () => { - this.textures.addAtlas('aztec', aztecImg, aztecAtlas); - }; - } - - create() { - this.add.text(0, 0, 'constructs.gg', TEXT.HEADER); - } -} - -module.exports = Header; diff --git a/phaser-client/src/scenes/home.cryps.js b/phaser-client/src/scenes/home.cryps.js deleted file mode 100644 index c0620d11..00000000 --- a/phaser-client/src/scenes/home.cryps.js +++ /dev/null @@ -1,142 +0,0 @@ -const Phaser = require('phaser'); -const { remove } = require('lodash'); - -const { TEXT, COLOURS, POSITIONS: { CONSTRUCT_LIST } } = require('./constants'); -const genAvatar = require('./avatar'); -const { LineGroup, LineBox } = require('./elements/outline.rotate'); - -const ROW_HEIGHT = CONSTRUCT_LIST.height() * 0.1; -const ROW_WIDTH = CONSTRUCT_LIST.width(); - -const menuY = CONSTRUCT_LIST.height() * 0.8; - -const KEY_MAP = [ - 'keydown-ONE', - 'keydown-TWO', - 'keydown-THREE', -]; - -const NULL_UUID = '00000000-0000-0000-0000-000000000000'; - -class HomeConstructList extends Phaser.Scene { - constructor() { - super({ key: 'HomeConstructs' }); - } - - - updateData(parent, key, data) { - if (key === 'constructList') { - KEY_MAP.forEach(k => this.input.keyboard.removeListener(k)); - this.scene.restart(); - } - } - - create() { - // this.cameras.main.setViewport(CONSTRUCT_LIST.x(), CONSTRUCT_LIST.y(), CONSTRUCT_LIST.width(), CONSTRUCT_LIST.height()); - this.registry.events.on('changedata', this.updateData, this); - this.registry.events.on('setdata', this.updateData, this); - const constructs = this.registry.get('constructList'); - const lineGroup = this.add.existing(new LineGroup(this)); - - if (!constructs) return true; - const ws = this.registry.get('ws'); - this.activeConstructs = []; - // We only display 3 constructs others can be viewed in construct list (soon TM) - for (let i = 0; i < constructs.length; i += 1) { - const construct = constructs[i]; - const BOX_WIDTH = Math.floor(ROW_WIDTH / 5); - const ROW_X = BOX_WIDTH * 2 * (i % 3); - const ROW_Y = CONSTRUCT_LIST.y() + (Math.floor(i / 3)) * ROW_HEIGHT * 1.5; - const ACTIVE_FILL = 0.2; - - const FILL = Object.values(COLOURS)[i]; - // Selection of constructs - - // Construct avatar and interaction box - const cReady = this.add - .rectangle(ROW_X, ROW_Y + ROW_HEIGHT * 0.2, BOX_WIDTH * 2, ROW_HEIGHT, FILL) - .setInteractive() - .setOrigin(0); - cReady.setAlpha(0.2); - cReady.on('pointerdown', () => { - lineGroup.clear(true, true); - if (this.activeConstructs.includes(cReady)) { - remove(this.activeConstructs, n => n === cReady); - cReady.setAlpha(0.2); - } else { - this.activeConstructs.push(cReady); - cReady.setAlpha(0.75); - lineGroup.add(this.add.existing( - new LineBox(this, cReady.x, cReady.y, cReady.width, cReady.height, cReady.fillColor, 3) - )); - } - }); - - cReady.itemSelect = () => { - cReady.setFillStyle(COLOURS.SELECT); - }; - cReady.itemDeselect = () => { - cReady.setFillStyle(FILL, ACTIVE_FILL); - }; - - cReady.construct = construct; - this.add.image( - cReady.getCenter().x, - cReady.getCenter().y, - 'aztec', - genAvatar(construct.name) - ); - this.add.text(ROW_X + BOX_WIDTH, ROW_Y, construct.name, TEXT.HEADER) - .setOrigin(0.5, 0.5); - } - - // Add Spawn Construct Option - const spawn = this.add - .rectangle(ROW_WIDTH * 0.05, menuY, ROW_WIDTH * 0.2, ROW_HEIGHT * 0.5, 0x888888) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => { - this.game.events.emit('CONSTRUCT_SPAWN'); - }); - this.add - .text(spawn.getCenter().x, spawn.getCenter().y, '+', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - const joinNormal = this.add - .rectangle(ROW_WIDTH * 0.3, menuY, ROW_WIDTH * 0.4, ROW_HEIGHT * 0.5, 0x888888) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => { - const playerConstructs = []; - this.activeConstructs.forEach(obj => playerConstructs.push(obj.construct.id)); - ws.sendPlayerConstructsSet(NULL_UUID, playerConstructs); - }); - this.add - .text(joinNormal.getCenter().x, joinNormal.getCenter().y, 'Join Normal', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - const joinInstance = this.add - .rectangle(ROW_WIDTH * 0.8, menuY, ROW_WIDTH * 0.4, ROW_HEIGHT * 0.5, 0x888888) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => { - const playerConstructs = []; - this.activeConstructs.forEach(obj => playerConstructs.push(obj.construct.id)); - ws.sendInstanceJoin(playerConstructs); - }); - this.add - .text(joinInstance.getCenter().x, joinInstance.getCenter().y, 'New Instance', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - return this; - } - - cleanUp() { - KEY_MAP.forEach(k => this.input.keyboard.removeListener(k)); - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - this.scene.remove(); - } -} - -module.exports = HomeConstructList; diff --git a/phaser-client/src/scenes/home.instances.js b/phaser-client/src/scenes/home.instances.js deleted file mode 100644 index db4e6994..00000000 --- a/phaser-client/src/scenes/home.instances.js +++ /dev/null @@ -1,48 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { HOME_MAIN }, TEXT } = require('./constants'); - -const X = HOME_MAIN.x(); -const Y = HOME_MAIN.y(); -const WIDTH = HOME_MAIN.width(); -const HEIGHT = HOME_MAIN.height(); - -const NULL_UUID = '00000000-0000-0000-0000-000000000000'; - -class HomeRankings extends Phaser.Scene { - constructor() { - super({ key: 'HomeInstances' }); - } - - create() { - this.add.text(X, Y, 'Instances Scene', TEXT.HEADER); - const playerList = this.registry.get('playerList'); - const addInstance = (player, i) => { - const joinNormal = this.add - .rectangle(X, Y + HEIGHT * 0.15 * (i + 1), WIDTH * 0.5, HEIGHT * 0.1, 0x888888) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => { - if (player.ready) { - this.registry.set('player', player); - this.registry.get('ws').sendInstanceReady(player.instance); - } else { - this.game.events.emit('SET_PLAYER', player); - this.registry.get('ws').sendInstanceScores(player.instance); - } - }); - const name = player.instance === NULL_UUID ? 'Normal Mode' : `${player.instance.substring(0, 5)}`; - const disp = player.ready ? name.concat(' - in progress') : name; - this.add - .text(joinNormal.getCenter().x, joinNormal.getCenter().y, disp, TEXT.NORMAL) - .setOrigin(0.5, 0.5); - }; - - playerList.forEach(addInstance); - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = HomeRankings; diff --git a/phaser-client/src/scenes/home.js b/phaser-client/src/scenes/home.js deleted file mode 100644 index fb03e009..00000000 --- a/phaser-client/src/scenes/home.js +++ /dev/null @@ -1,91 +0,0 @@ -const Phaser = require('phaser'); - - -const HomeConstructs = require('./home.constructs'); -const HomeNavigation = require('./home.navigation'); - -const HomeRankings = require('./home.rankings'); -const HomeNews = require('./home.news'); -const HomeShop = require('./home.shop'); -const HomeInstances = require('./home.instances'); - -const FIXED_SCENES = [ - 'HomeConstructs', - 'HomeNavigation', -]; - -const VAR_SCENES = [ - 'HomeRankings', - 'HomeNews', - 'HomeShop', - 'HomeInstances', -]; - -class Home extends Phaser.Scene { - constructor() { - super({ key: 'Home', active: true }); - } - - create() { - this.registry.get('ws').sendAccountInstances(); - - this.registry.events.on('changedata', this.updateData, this); - this.registry.events.on('setdata', this.updateData, this); - this.scene.manager.add('HomeConstructs', HomeConstructs, true); - this.scene.manager.add('HomeNavigation', HomeNavigation, true); - - - return true; - } - - updateData(parent, key, data) { - if (!data) return false; - // Controls which scene shows in the main top right section - switch (key) { - case 'game': return this.cleanUp(); - case 'menu': return this.cleanUp(); - case 'homeInstances': return this.newMainScene('HomeInstances', HomeInstances, data); - case 'homeRankings': return this.newMainScene('HomeRankings', HomeRankings, data); - case 'homeNews': return this.newMainScene('HomeNews', HomeNews, data); - case 'homeShop': return this.newMainScene('HomeShop', HomeShop, data); - - - default: return false; - } - } - - newMainScene(key, scene, data) { - let addScene = true; - // List of scenes which could be occupying the main section of the menu - VAR_SCENES.forEach((sKey) => { - if (this.scene.manager.keys[sKey]) { - if (key === sKey) { - // If there is new data for the current scene restart - this.scene.manager.keys[sKey].scene.restart(data); - addScene = false; - } else { - // Delete the old scene - this.scene.manager.keys[sKey].cleanUp(); - } - } - }); - if (addScene) this.scene.manager.add(key, scene, true, data); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - // Delete scenes which could be showing before switching to battle scene - - const removeScenes = (sKey) => { - if (this.scene.get(sKey)) this.scene.get(sKey).cleanUp(); - }; - FIXED_SCENES.forEach(removeScenes); - VAR_SCENES.forEach(removeScenes); - - - this.scene.remove(); - } -} - -module.exports = Home; diff --git a/phaser-client/src/scenes/home.navigation.js b/phaser-client/src/scenes/home.navigation.js deleted file mode 100644 index 40846df8..00000000 --- a/phaser-client/src/scenes/home.navigation.js +++ /dev/null @@ -1,61 +0,0 @@ -const Phaser = require('phaser'); - -const { TEXT, POSITIONS: { NAVIGATION } } = require('./constants'); - -const X = NAVIGATION.x(); -const Y = NAVIGATION.y(); -const WIDTH = NAVIGATION.width(); -const HEIGHT = NAVIGATION.height(); - -const BTN_WIDTH = Math.floor(WIDTH / 6); -const BTN_HEIGHT = Math.floor(HEIGHT / 3); - -class HomeNavigation extends Phaser.Scene { - constructor() { - super({ key: 'HomeNavigation' }); - } - - create() { -/* const ranks = this.add - .rectangle(X, Y, BTN_WIDTH, BTN_HEIGHT, 0x222222) - .setInteractive() - .setOrigin(0); - this.add - .text(ranks.getCenter().x, ranks.getCenter().y, 'Rankings', TEXT.HEADER) - .setOrigin(0.5, 0.5); - ranks.on('pointerdown', () => this.registry.set('homeRankings', true)); - - const news = this.add - .rectangle(X + BTN_WIDTH * 1.5, Y, BTN_WIDTH, BTN_HEIGHT, 0x222222) - .setInteractive() - .setOrigin(0); - this.add - .text(news.getCenter().x, news.getCenter().y, 'News', TEXT.HEADER) - .setOrigin(0.5, 0.5); - news.on('pointerdown', () => this.registry.set('homeNews', true)); - - const shop = this.add - .rectangle(X + BTN_WIDTH * 3, Y, BTN_WIDTH, BTN_HEIGHT, 0x222222) - .setInteractive() - .setOrigin(0); - this.add - .text(shop.getCenter().x, shop.getCenter().y, 'Shop', TEXT.HEADER) - .setOrigin(0.5, 0.5); - shop.on('pointerdown', () => this.registry.set('homeShop', true)); - - const instances = this.add - .rectangle(X + BTN_WIDTH * 4.5, Y, BTN_WIDTH, BTN_HEIGHT, 0x222222) - .setInteractive() - .setOrigin(0); - this.add - .text(instances.getCenter().x, instances.getCenter().y, 'Instances', TEXT.HEADER) - .setOrigin(0.5, 0.5); - instances.on('pointerdown', () => this.registry.set('homeInstances', true));*/ - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = HomeNavigation; diff --git a/phaser-client/src/scenes/home.news.js b/phaser-client/src/scenes/home.news.js deleted file mode 100644 index 9e7937df..00000000 --- a/phaser-client/src/scenes/home.news.js +++ /dev/null @@ -1,24 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { HOME_MAIN }, TEXT } = require('./constants'); - -const X = HOME_MAIN.x(); -const Y = HOME_MAIN.y(); -const WIDTH = HOME_MAIN.width(); -const HEIGHT = HOME_MAIN.height(); - -class HomeNews extends Phaser.Scene { - constructor() { - super({ key: 'HomeNews' }); - } - - create() { - this.add.text(X, Y, 'News Scene', TEXT.HEADER); - this.add.text(X, Y + HEIGHT * 0.1, 'some other stuff here', TEXT.NORMAL); - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = HomeNews; diff --git a/phaser-client/src/scenes/home.rankings.js b/phaser-client/src/scenes/home.rankings.js deleted file mode 100644 index 0d6dc0d1..00000000 --- a/phaser-client/src/scenes/home.rankings.js +++ /dev/null @@ -1,24 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { HOME_MAIN }, TEXT } = require('./constants'); - -const X = HOME_MAIN.x(); -const Y = HOME_MAIN.y(); -const WIDTH = HOME_MAIN.width(); -const HEIGHT = HOME_MAIN.height(); - -class HomeRankings extends Phaser.Scene { - constructor() { - super({ key: 'HomeRankings' }); - } - - create() { - this.add.text(X, Y, 'Rankings Scene', TEXT.HEADER); - this.add.text(X, Y + HEIGHT * 0.1, 'some stuff here', TEXT.NORMAL); - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = HomeRankings; diff --git a/phaser-client/src/scenes/home.shop.js b/phaser-client/src/scenes/home.shop.js deleted file mode 100644 index 24ed0921..00000000 --- a/phaser-client/src/scenes/home.shop.js +++ /dev/null @@ -1,24 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { HOME_MAIN }, TEXT } = require('./constants'); - -const X = HOME_MAIN.x(); -const Y = HOME_MAIN.y(); -const WIDTH = HOME_MAIN.width(); -const HEIGHT = HOME_MAIN.height(); - -class HomeShop extends Phaser.Scene { - constructor() { - super({ key: 'HomeShop' }); - } - - create() { - this.add.text(X, Y, 'Shop Scene', TEXT.HEADER); - this.add.text(X, Y + HEIGHT * 0.1, 'rulul', TEXT.NORMAL); - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = HomeShop; diff --git a/phaser-client/src/scenes/item.info.js b/phaser-client/src/scenes/item.info.js deleted file mode 100644 index 0e116ae3..00000000 --- a/phaser-client/src/scenes/item.info.js +++ /dev/null @@ -1,78 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { MENU_MAIN }, TEXT, ITEMS: { SKILLS, SPECS, COLOURS } } = require('./constants'); - -const X = MENU_MAIN.x(); -const Y = MENU_MAIN.y(); -const WIDTH = MENU_MAIN.width(); -const HEIGHT = MENU_MAIN.height(); - -const UNEQUIP_Y = Y + Math.floor(HEIGHT * 0.7); -const UNEQUIP_WIDTH = Math.floor(WIDTH * 0.4); -const UNEQUIP_HEIGHT = Math.floor(HEIGHT * 0.15); - -class ItemInfo extends Phaser.Scene { - constructor() { - super({ key: 'ItemInfo' }); - } - - create(props) { - const { item, construct } = props; - if (!item) return false; - - // Default item text - let title = item; - let description = 'Description missing'; - let upgrades = ''; - let colours = ''; - - // Replace item text with constants if it exists - if (SKILLS[item]) { - title = `Skill Item - ${item}`; - ({ description } = SKILLS[item]); - if (SKILLS[item].upgrades) ({ upgrades } = SKILLS[item]); - if (SKILLS[item].colours) ({ colours } = SKILLS[item]); - } else if (SPECS[item]) { - title = `Spec Item - ${item}`; - ({ description } = SPECS[item]); - if (SPECS[item].upgrades) ({ upgrades } = SPECS[item]); - } else if (COLOURS[item]) { - title = `Colour Item - ${item}`; - ({ description } = COLOURS[item]); - if (COLOURS[item].upgrades) ({ upgrades } = COLOURS[item]); - } - - // Add text objects - this.add.text(X, Y, title, TEXT.HEADER); - this.add - .text(X, Y + HEIGHT * 0.1, description, TEXT.NORMAL) - .setWordWrapWidth(WIDTH * 0.75); - this.add - .text(X, Y + HEIGHT * 0.25, upgrades, TEXT.NORMAL) - .setWordWrapWidth(WIDTH * 0.75); - if (colours !== '') { - this.add - .text(X, Y + HEIGHT * 0.35, `Adds ${colours} to construct`, TEXT.NORMAL) - .setWordWrapWidth(WIDTH * 0.75); - } - - if (!construct) return true; - const ws = this.registry.get('ws'); - const { vbox } = this.registry.get('player'); - const unEquip = this.add.rectangle(X, UNEQUIP_Y, UNEQUIP_WIDTH, UNEQUIP_HEIGHT, 0x222222) - .setOrigin(0, 0) - .setInteractive() - .on('pointerdown', () => { - ws.sendVboxUnequip(vbox.instance, construct.id, item); - this.registry.set('constructStats', construct); - }); - this.add.text(unEquip.getCenter().x, unEquip.getCenter().y, 'unequip', TEXT.HEADER) - .setOrigin(0.5, 0.5); - return true; - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = ItemInfo; diff --git a/phaser-client/src/scenes/item.list.js b/phaser-client/src/scenes/item.list.js deleted file mode 100644 index 74758520..00000000 --- a/phaser-client/src/scenes/item.list.js +++ /dev/null @@ -1,323 +0,0 @@ -const Phaser = require('phaser'); - -const Item = require('./elements/item'); - -const { - TEXT, - POSITIONS: { ITEM_LIST }, -} = require('./constants'); - -const X = ITEM_LIST.x(); -const Y = ITEM_LIST.y(); -const WIDTH = ITEM_LIST.width(); -const HEIGHT = ITEM_LIST.height(); -const ITEM_WIDTH = ITEM_LIST.itemWidth(); -const ITEM_HEIGHT = ITEM_LIST.itemHeight(); - -const BOX_X = X + ITEM_WIDTH * 0.5; -const BOX_Y = Y + ITEM_HEIGHT + ITEM_HEIGHT * 2; -const BOX_ROWS = 6; -const BOX_COLUMNS = 3; - -const INV_X = X + ITEM_WIDTH * 0.5; -const INV_Y = Y + ITEM_HEIGHT * 12; -const INV_ROWS = 3; -const INV_COLUMNS = 3; - -const COMB_X = X + ITEM_WIDTH * 0.5; -const COMB_Y = Y + ITEM_HEIGHT * 19; -const COMB_ROWS = 1; -const COMB_COLUMNS = 3; - -const drawVbox = (graphics) => { - const boxDrawX = BOX_X - ITEM_WIDTH * 0.05; - const boxDrawY = BOX_Y - ITEM_HEIGHT * 0.05; - graphics.strokeRect(boxDrawX, boxDrawY, ITEM_WIDTH * 1.1 * BOX_COLUMNS, ITEM_HEIGHT * 1.1 * BOX_ROWS); - - for (let i = 0; i < (BOX_COLUMNS - 1); i += 1) { - const x = boxDrawX + (i + 1) * ITEM_WIDTH * 1.1; - graphics.lineBetween(x, boxDrawY, x, boxDrawY + ITEM_HEIGHT * 1.1 * BOX_ROWS); - } - for (let i = 0; i < (BOX_ROWS - 1); i += 1) { - const y = boxDrawY + (i + 1) * ITEM_HEIGHT * 1.1; - graphics.lineBetween(boxDrawX, y, boxDrawX + ITEM_WIDTH * 1.1 * BOX_COLUMNS, y); - } -}; - -const drawInventory = (graphics) => { - const invDrawX = INV_X - ITEM_WIDTH * 0.05; - const invDrawY = INV_Y - ITEM_HEIGHT * 0.05; - graphics.strokeRect(invDrawX, invDrawY, ITEM_WIDTH * 1.1 * INV_COLUMNS, ITEM_HEIGHT * 1.1 * INV_ROWS); - - for (let i = 0; i < (INV_COLUMNS - 1); i += 1) { - const x = invDrawX + (i + 1) * ITEM_WIDTH * 1.1; - graphics.lineBetween(x, invDrawY, x, invDrawY + ITEM_HEIGHT * 1.1 * INV_ROWS); - } - for (let i = 0; i < (INV_ROWS - 1); i += 1) { - const y = invDrawY + (i + 1) * ITEM_HEIGHT * 1.1; - graphics.lineBetween(invDrawX, y, invDrawX + ITEM_WIDTH * 1.1 * INV_COLUMNS, y); - } -}; - -const drawCombiner = (graphics) => { - const combDrawX = COMB_X - ITEM_WIDTH * 0.05; - const combDrawY = COMB_Y - ITEM_HEIGHT * 0.05; - graphics.strokeRect(combDrawX, combDrawY, ITEM_WIDTH * 1.1 * COMB_COLUMNS, ITEM_HEIGHT * 1.1 * COMB_ROWS); - - for (let i = 0; i < (COMB_COLUMNS - 1); i += 1) { - const x = combDrawX + (i + 1) * ITEM_WIDTH * 1.1; - graphics.lineBetween(x, combDrawY, x, combDrawY + ITEM_HEIGHT * 1.1 * COMB_ROWS); - } - for (let i = 0; i <= (COMB_ROWS - 1); i += 1) { - const y = combDrawY + (i + 1) * ITEM_HEIGHT * 1.1; - graphics.lineBetween(combDrawX, y, combDrawX + ITEM_WIDTH * 1.1 * COMB_COLUMNS, y); - } -}; - -class CombinerHitBox extends Phaser.GameObjects.Rectangle { - constructor(scene, x, y, i) { - super(scene, x, y, ITEM_WIDTH, ITEM_HEIGHT, 0x000000); - this.setOrigin(0); - this.x = x; - this.y = y; - this.slot = i; - this.item = false; - this.itemSelect = () => this.setFillStyle(0x222222); - this.itemDeselect = () => this.setFillStyle(0x000000); - } - - allocate(item) { - if (this.item) this.deallocate(); - item.setPosition(this.x + item.width / 2, this.y + item.height / 2); - this.item = item; - } - - deallocate() { - if (this.item) this.item.setPosition(this.item.origX, this.item.origY); - this.item = false; - } -} - -class DeleteHitBox extends Phaser.GameObjects.Rectangle { - constructor(scene, x, y) { - super(scene, x, y, ITEM_WIDTH * 3.4, ITEM_HEIGHT * 1.25, 0x444444); - this.setOrigin(0); - this.itemSelect = () => this.setFillStyle(0xff0000); - this.itemDeselect = () => this.setFillStyle(0x444444); - } -} - - -const itemCheckHitbox = (scene, pointer) => { - const { list } = scene.scene.get('MenuConstructList').children; - const hitboxes = list.filter(c => c.construct) - .concat(scene.children.list.filter(c => c instanceof CombinerHitBox || c instanceof DeleteHitBox)); - - let found; - for (let i = 0; i < hitboxes.length; i += 1) { - if (Phaser.Geom.Rectangle.ContainsPoint(hitboxes[i].getBounds(), pointer.position)) { - found = hitboxes[i]; - } else { - hitboxes[i].itemDeselect(); - } - } - - return found; -}; - -class ItemList extends Phaser.Scene { - constructor() { - super({ key: 'ItemList', active: true }); - } - - updateData(parent, key, data) { - if (key === 'player' || key === 'scores') { - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - this.scene.restart(); - } - } - - create() { - const player = this.registry.get('player'); - const scores = this.registry.get('scores') || []; - if (!player) return false; - const { vbox } = player; - this.registry.events.on('changedata', this.updateData, this); - this.registry.events.on('setdata', this.updateData, this); - if (!vbox.bound) return false; - if (!this.combinerItems || vbox.bound.length < this.registry.get('boundLength')) { - this.combinerItems = [-1, -1, -1]; - } - this.registry.set('boundLength', vbox.bound.length); - const ws = this.registry.get('ws'); - - // Static Elements - const graphics = this.add.graphics(); - graphics.lineStyle(5, 0x808080, 1.0); - drawCombiner(graphics); - drawInventory(graphics); - drawVbox(graphics); - - this.add.text(X + ITEM_WIDTH * 0.5, Y + ITEM_HEIGHT * 0.5, `vBox - ${vbox.bits}b`, TEXT.HEADER); - this.add.text(X + ITEM_WIDTH * 0.5, Y + ITEM_HEIGHT * 11, 'inventory', TEXT.HEADER); - this.add.text(X + ITEM_WIDTH * 0.5, Y + ITEM_HEIGHT * 18, 'iCombinator', TEXT.HEADER); - this.add.text(X + ITEM_WIDTH * 0.5, Y + ITEM_HEIGHT * 23, `Wins: ${player.score.wins}`, TEXT.HEADER); - this.add.text(X + ITEM_WIDTH * 0.5, Y + ITEM_HEIGHT * 24, `Losses: ${player.score.losses}`, TEXT.HEADER); - - const discard = this.add - .rectangle(X + ITEM_WIDTH * 0.4, Y + ITEM_HEIGHT * 1.5, ITEM_WIDTH * 3.4, ITEM_HEIGHT * 1.25, 0x444444) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => this.registry.get('ws').sendVboxDiscard(vbox.instance)); - this.add.text(discard.getCenter().x, discard.getCenter().y, 'discard - 5b', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - const combine = this.add - .rectangle(X + ITEM_WIDTH * 0.4, Y + ITEM_HEIGHT * 20.25, ITEM_WIDTH * 3.4, ITEM_HEIGHT * 1.25, 0x444444) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => { - ws.sendVboxCombine(vbox.instance, this.combinerItems); - this.combinerItems = [-1, -1, -1]; - this.children.list.filter(obj => obj instanceof CombinerHitBox).forEach(cBox => cBox.deallocate()); - }); - this.add.text(combine.getCenter().x, combine.getCenter().y, 'combine', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - for (let i = 0; i < 3; i += 1) { - const ITEM_X = ITEM_WIDTH * 1.1 * (i % COMB_COLUMNS) + COMB_X; - const ITEM_Y = ITEM_HEIGHT * 1.1 * Math.floor(i / COMB_COLUMNS) + COMB_Y; - this.add.existing(new CombinerHitBox(this, ITEM_X, ITEM_Y, i)); - } - const del = this.add.existing(new DeleteHitBox(this, X + ITEM_WIDTH * 0.4, Y + ITEM_HEIGHT * 15.5)); - this.add.text(del.getCenter().x, del.getCenter().y, 'drop', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - // Generate Items - vbox.bound.forEach((item, i) => { - const ITEM_X = ITEM_WIDTH * 1.1 * (i % INV_COLUMNS) + INV_X + ITEM_WIDTH * 0.5; - const ITEM_Y = ITEM_HEIGHT * 1.1 * Math.floor(i / INV_COLUMNS) + INV_Y + ITEM_HEIGHT * 0.5; - const clickFn = () => this.registry.set('itemInfo', { item }); - const itemBox = new Item(this, item, i, ITEM_X, ITEM_Y, ITEM_WIDTH, ITEM_HEIGHT); - itemBox.on('pointerdown', clickFn); - - this.input.setDraggable(itemBox); - this.add.existing(itemBox); - }); - - vbox.free.forEach((type, i) => { - type.forEach((item, j) => { - const ITEM_X = ITEM_WIDTH * 1.1 * i + BOX_X + ITEM_WIDTH * 0.5; - const ITEM_Y = ITEM_HEIGHT * 1.1 * j + BOX_Y + ITEM_HEIGHT * 0.5; - const clickFn = () => { - this.registry.set('itemInfo', { item }); - ws.sendVboxAccept(vbox.instance, i, j); - }; - const itemBox = new Item(this, item, i, ITEM_X, ITEM_Y, ITEM_WIDTH, ITEM_HEIGHT); - itemBox.on('pointerdown', clickFn); - this.add.existing(itemBox); - }); - }); - - // Restore previous combiner item slots - this.combinerItems.forEach((index, i) => { - if (index === -1) return false; - const item = this.children.list.filter(obj => obj instanceof Item).find(it => it.index === index); - const hitBox = this.children.list.filter(obj => obj instanceof CombinerHitBox).find(hb => hb.slot === i); - if (item) hitBox.allocate(item); - return true; - }); - - // allocation functions - const allocate = (item, hitBox) => { - hitBox.allocate(item); - this.combinerItems[hitBox.slot] = item.index; - this.registry.set('combinerItems', this.combinerItems); - }; - - const deallocate = (item) => { - const clearIndex = this.combinerItems.indexOf(item.index); - if (clearIndex !== -1) { - this.children.list.filter(obj => obj instanceof CombinerHitBox) - .forEach((cBox) => { - if (cBox.item === item) cBox.deallocate(); - }); - this.combinerItems[clearIndex] = -1; - this.registry.set('combinerItems', this.combinerItems); - } - item.setPosition(item.origX, item.origY); - }; - - const findUnallocated = () => { - for (let i = 0; i <= 2; i += 1) { - if (this.combinerItems[i] === -1) { - return this.children.list.filter(obj => obj instanceof CombinerHitBox).find(hb => hb.slot === i); - } - } return false; - }; - - // this.add.text(ITEM_WIDTH * 11, ITEM_HEIGHT * 1.1, 'Scoreboard', TEXT.HEADER); - // scores.forEach(([name, score], i) => { - // const SCORE_X = ITEM_WIDTH * 11; - // const SCORE_Y = ITEM_HEIGHT * 1.1 * (i + 2); - // this.add.text(SCORE_X, SCORE_Y, `${score.wins} - ${score.losses} | ${name}`, TEXT.NORMAL); - // }); - - // Add Handlers - this.input.on('dragstart', (pointer, item) => { - if (!(item instanceof Item)) return false; - return true; - }); - - this.input.on('drag', (pointer, item, dragX, dragY) => { - if (!(item instanceof Item)) return false; - item.setPosition(dragX, dragY); - const hitBox = itemCheckHitbox(this, pointer); - if (hitBox) hitBox.itemSelect(); - return true; - }); - - this.input.on('dragend', (pointer, item) => { - if (!(item instanceof Item)) return false; - // Check first for hitbox interaction - const hitBox = itemCheckHitbox(this, pointer); - if (hitBox) { - // hitbox can only be the combinerhitbox, deletehitbox or construct avatar - hitBox.itemDeselect(); - if (hitBox instanceof CombinerHitBox) { - if (hitBox.item === item) deallocate(item); - else allocate(item, hitBox); - } else if (hitBox instanceof DeleteHitBox) { - ws.sendVboxReclaim(vbox.instance, item.index); - } else { - ws.sendVboxApply(vbox.instance, hitBox.construct.id, item.index); - deallocate(item); - } return true; - } - // If not interacting with hitbox and didn't move much try to allocate the item - if (Math.hypot(item.x - item.origX, item.y - item.origY) < Math.hypot(item.width, item.height)) { - // Check theres a free combiner slot - const cBox = findUnallocated(); - if (cBox) { - allocate(item, cBox); - return true; - } - } - // If the item hasn't been allocated above reset to natural location - // Check if item needs to be deallocated - // Scene will restart if there is vbox change - deallocate(item); - return true; - }); - return this; - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - this.scene.remove(); - } -} - -module.exports = ItemList; diff --git a/phaser-client/src/scenes/menu.cryps.list.js b/phaser-client/src/scenes/menu.cryps.list.js deleted file mode 100644 index d5792e71..00000000 --- a/phaser-client/src/scenes/menu.cryps.list.js +++ /dev/null @@ -1,137 +0,0 @@ -const Phaser = require('phaser'); - -const { TEXT, COLOURS, POSITIONS: { CONSTRUCT_LIST } } = require('./constants'); -const genAvatar = require('./avatar'); -const Item = require('./elements/item'); - -const BOX_WIDTH = Math.floor(CONSTRUCT_LIST.width()); -const BOX_HEIGHT = Math.floor(CONSTRUCT_LIST.height() / 3.34); - -const TEXT_MARGIN = 24; - -const KEY_MAP = [ - 'keydown-ONE', - 'keydown-TWO', - 'keydown-THREE', -]; - -class MenuConstructList extends Phaser.Scene { - constructor() { - super({ key: 'MenuConstructList' }); - } - - create() { - this.registry.events.on('changedata', this.updateData, this); - this.registry.events.on('setdata', this.updateData, this); - const player = this.registry.get('player'); - if (player) this.drawConstructs(player.constructs); - } - - updateData(parent, key, data) { - if (key === 'player') { - this.drawConstructs(data.constructs); - } - } - - drawConstructs(constructs) { - if (!constructs) return true; - if (this.constructGroup) this.constructGroup.destroy(true); - this.constructGroup = this.add.group(); - const addConstruct = (construct, i) => { - const ROW_X = CONSTRUCT_LIST.x(); - const ROW_Y = CONSTRUCT_LIST.y() + BOX_HEIGHT * i * 1.1; - - - const ACTIVE_FILL = 0.2; - - const FILL = Object.values(COLOURS)[i]; - // Selection of constructs - const selectFn = () => { - this.registry.set('constructStats', construct); - }; - - // Construct interaction box for adding items - const constructInteract = this.add - .rectangle(ROW_X, ROW_Y, BOX_WIDTH, BOX_HEIGHT, FILL, ACTIVE_FILL) - .setInteractive() - .setOrigin(0) - .on('pointerdown', selectFn); - constructInteract.itemSelect = () => { - constructInteract.setFillStyle(COLOURS.SELECT); - }; - constructInteract.itemDeselect = () => { - constructInteract.setFillStyle(FILL, ACTIVE_FILL); - }; - constructInteract.construct = construct; - - // Construct Avatar - const { name } = construct; - const constructImage = this.add.image( - constructInteract.getCenter().x - constructInteract.width / 4, - constructInteract.getCenter().y, - 'aztec', - genAvatar(name) - ); - - // Add text info - const yConstructTextAlgin = Math.floor(constructInteract.y + TEXT_MARGIN / 2); - const xConstructNameAlign = Math.floor(constructInteract.x + constructInteract.width * 1 / 10); - const constructInfoText = this.add.text(xConstructNameAlign, yConstructTextAlgin, name, TEXT.HEADER); - const colourText = (c, j) => { - // Placeholder for when gems are implemented - const gemText = this.add.text(constructInteract.x + constructInteract.width * (j + 3) / 6, yConstructTextAlgin, `${c[0]} - ${c[1]}`, TEXT.HEADER); - this.constructGroup.add(gemText); - }; - - const { red, green, blue } = construct.colours; - const CONSTRUCT_COLOURS = [ - ['R', red], - ['G', green], - ['B', blue], - ]; - CONSTRUCT_COLOURS.forEach(colourText); - - this.constructGroup.addMultiple([constructInteract, constructImage, constructInfoText]); - - const constructSkill = (stat, j) => { - const SKILL_WIDTH = Math.floor(BOX_WIDTH / 2); - const SKILL_HEIGHT = Math.floor(BOX_HEIGHT / 8); - const SKILL_X = constructInteract.getCenter().x + constructInteract.width / 4; - const SKILL_Y = constructInteract.y + SKILL_HEIGHT * 1.15 * (j + 1.6); - const itemObj = new Item(this, stat.skill, j, SKILL_X, SKILL_Y, SKILL_WIDTH, SKILL_HEIGHT); - this.add.existing(itemObj); - itemObj.setInteractive(); - const itemInfo = { item: stat.skill, construct }; - itemObj.on('pointerdown', () => this.registry.set('itemInfo', itemInfo)); - this.constructGroup.add(itemObj); - }; - construct.skills.forEach(constructSkill); - - const constructSpec = (spec, j) => { - const SKILL_WIDTH = Math.floor(BOX_WIDTH * 0.15); - const SKILL_HEIGHT = Math.floor(BOX_HEIGHT * 0.2); - const SKILL_X = Math.floor(constructInteract.x + BOX_WIDTH * (0.6 + j) * 0.175); - const SKILL_Y = Math.floor(constructInteract.y + BOX_HEIGHT * 0.875); - const itemObj = new Item(this, spec, j, SKILL_X, SKILL_Y, SKILL_WIDTH, SKILL_HEIGHT); - itemObj.setInteractive(); - const itemInfo = { item: spec, construct }; - itemObj.on('pointerdown', () => this.registry.set('itemInfo', itemInfo)); - this.add.existing(itemObj); - this.constructGroup.add(itemObj); - }; - construct.specs.forEach(constructSpec); - }; - constructs.forEach(addConstruct); - - return true; - } - - cleanUp() { - KEY_MAP.forEach(k => this.input.keyboard.removeListener(k)); - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - this.scene.remove(); - } -} - -module.exports = MenuConstructList; diff --git a/phaser-client/src/scenes/menu.js b/phaser-client/src/scenes/menu.js deleted file mode 100644 index 091335d7..00000000 --- a/phaser-client/src/scenes/menu.js +++ /dev/null @@ -1,97 +0,0 @@ -const Phaser = require('phaser'); - -// Scenes constantly showing -const MenuConstructList = require('./menu.constructs.list'); -const MenuNavigation = require('./menu.navigation'); -const ItemList = require('./item.list'); -// Scenes which change depending on menu context -const Zones = require('./zones'); -const GameList = require('./game.list'); -const StatSheet = require('./statsheet'); -const ItemInfo = require('./item.info'); - -const FIXED_MENU_SCENES = [ - 'MenuConstructList', - 'MenuNavigation', - 'ItemList', -]; - -const MAIN_MENU_SCENES = [ - 'Zones', - 'GameList', - 'StatSheet', - 'ItemInfo', -]; - -class Menu extends Phaser.Scene { - constructor() { - super({ key: 'Menu', active: true }); - } - - create() { - this.registry.events.on('changedata', this.updateData, this); - this.registry.events.on('setdata', this.updateData, this); - - // Request the latest player state when we load the scene - const player = this.registry.get('player'); - this.registry.get('ws').sendPlayerState(player.instance); - // When we load the menu request the latest items - // Item list will restart when the data comes in - this.scene.manager.add('MenuConstructList', MenuConstructList, true); - this.scene.manager.add('MenuNavigation', MenuNavigation, true); - this.scene.manager.add('ItemList', ItemList, true); - this.registry.set('inMenu', true); - - return true; - } - - updateData(parent, key, data) { - if (!data) return false; - // Controls which scene shows in the main top right section - switch (key) { - case 'game': return this.cleanUp(); - case 'home': return this.cleanUp(); - case 'zone': return this.newMainScene('Zones', Zones, data); - case 'gameList': return this.newMainScene('GameList', GameList, data); - case 'constructStats': return this.newMainScene('StatSheet', StatSheet, data); - case 'itemInfo': return this.newMainScene('ItemInfo', ItemInfo, data); - default: return false; - } - } - - newMainScene(key, scene, data) { - let addScene = true; - // List of scenes which could be occupying the main section of the menu - MAIN_MENU_SCENES.forEach((sKey) => { - if (this.scene.manager.keys[sKey]) { - if (key === sKey) { - // If there is new data for the current scene restart - this.scene.manager.keys[sKey].scene.restart(data); - addScene = false; - } else { - // Delete the old scene - this.scene.manager.keys[sKey].cleanUp(); - } - } - }); - if (addScene) this.scene.manager.add(key, scene, true, data); - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData, this); - this.registry.events.off('setdata', this.updateData, this); - // Delete scenes which could be showing before switching to battle scene - const removeScenes = (sKey) => { - if (this.scene.get(sKey)) this.scene.get(sKey).cleanUp(); - }; - FIXED_MENU_SCENES.forEach(removeScenes); - MAIN_MENU_SCENES.forEach(removeScenes); - this.registry.set('inMenu', false); - this.combinerItems = this.registry.set('combinerItems', null); - - - this.scene.remove(); - } -} - -module.exports = Menu; diff --git a/phaser-client/src/scenes/menu.navigation.js b/phaser-client/src/scenes/menu.navigation.js deleted file mode 100644 index b6f72656..00000000 --- a/phaser-client/src/scenes/menu.navigation.js +++ /dev/null @@ -1,50 +0,0 @@ -const Phaser = require('phaser'); - -const { TEXT, POSITIONS: { NAVIGATION } } = require('./constants'); - -const X = NAVIGATION.x(); -const Y = NAVIGATION.y(); -const WIDTH = NAVIGATION.width(); -const HEIGHT = NAVIGATION.height(); - -const BTN_WIDTH = Math.floor(WIDTH / 4); -const BTN_HEIGHT = Math.floor(HEIGHT / 2); - -class MenuNavigation extends Phaser.Scene { - constructor() { - super({ key: 'MenuNavigation' }); - } - - create() { - const ws = this.registry.get('ws'); - const player = this.registry.get('player'); - this.cameras.main.setViewport(X, Y, WIDTH, HEIGHT); - - const ready = this.add - .rectangle(BTN_WIDTH * 3, 0, BTN_WIDTH, BTN_HEIGHT, 0x222222) - .setInteractive() - .setOrigin(0); - this.add - .text(ready.getCenter().x, ready.getCenter().y, 'Ready', TEXT.HEADER) - .setOrigin(0.5, 0.5); - ready.on('pointerdown', () => { - ws.sendInstanceReady(player.instance); - }); - - const menu = this.add - .rectangle(BTN_WIDTH * 3, BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT, 0x440000) - .setInteractive() - .setOrigin(0) - .on('pointerdown', () => this.registry.set('home', true)); - - this.add - .text(menu.getCenter().x, menu.getCenter().y, 'Menu', TEXT.HEADER) - .setOrigin(0.5, 0.5); - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = MenuNavigation; diff --git a/phaser-client/src/scenes/statsheet.js b/phaser-client/src/scenes/statsheet.js deleted file mode 100644 index 802a21d3..00000000 --- a/phaser-client/src/scenes/statsheet.js +++ /dev/null @@ -1,143 +0,0 @@ -const Phaser = require('phaser'); -const { POSITIONS: { MENU_MAIN }, TEXT, SKILLS } = require('./constants'); -const Item = require('./elements/item'); - -const X = MENU_MAIN.x(); -const Y = MENU_MAIN.y(); -const WIDTH = MENU_MAIN.width(); -const HEIGHT = MENU_MAIN.height(); -const TEXT_MARGIN = 24; - -const SKILL_WIDTH = Math.floor(WIDTH / 10); - - -class DeleteHitBox extends Phaser.GameObjects.Rectangle { - constructor(scene, x, y) { - super(scene, x, y, SKILL_WIDTH, SKILL_WIDTH, 0x222222); - this.setOrigin(0); - this.itemSelect = () => this.setFillStyle(0xff0000); - this.itemDeselect = () => this.setFillStyle(0x222222); - } -} - -const itemCheckHitbox = (scene, pointer) => { - const { list } = scene.scene.get('MenuConstructList').children; - const hitboxes = list.filter(c => c.construct) - .concat(scene.children.list.filter(c => c instanceof DeleteHitBox)); - - let found; - for (let i = 0; i < hitboxes.length; i += 1) { - if (Phaser.Geom.Rectangle.ContainsPoint(hitboxes[i].getBounds(), pointer.position)) { - found = hitboxes[i]; - } else { - hitboxes[i].itemDeselect(); - } - } - - return found; -}; - -class StatSheet extends Phaser.Scene { - constructor() { - super({ key: 'StatSheet' }); - } - - - updateData(parent, key, data) { - if (key === 'player') { - console.log('grep'); - console.log(data); - const construct = data.constructs.find(c => c.id === this.construct.id); - this.scene.restart(construct); - } - } - - create(construct) { - this.registry.events.on('changedata', this.updateData, this); - // const ws = this.registry.get('ws'); - - const player = this.registry.get('player'); - if (!player) return false; - // const { vbox } = player; - - this.construct = construct; - - /* - const del = this.add.existing(new DeleteHitBox(this, X + WIDTH * 0.7, Y + HEIGHT * 0.6)); - this.add.text(del.getCenter().x, del.getCenter().y, 'unequip', TEXT.HEADER) - .setOrigin(0.5, 0.5); - */ - - this.add.text(X, Y, construct.name, TEXT.HEADER); - - const constructStat = (stat, i) => { - const STAT_X = X; - const STAT_Y = Y + (i + 2) * TEXT_MARGIN; - this.add.text(STAT_X, STAT_Y, `${stat.stat}: ${stat.base} -> ${stat.value}`, TEXT.NORMAL); - }; - - const CONSTRUCT_STATS = [ - construct.hp, - construct.red_shield, - construct.blue_shield, - construct.evasion, - construct.red_damage, - construct.blue_damage, - construct.speed, - ]; - - CONSTRUCT_STATS.forEach(constructStat); - /* - const knownSkill = (skill, i) => { - const SKILL_X = X + WIDTH * 0.4 + WIDTH * 0.125 * i; - const SKILL_Y = Y + HEIGHT * 0.15; - const itemObj = new Item(this, skill.skill, i, SKILL_X, SKILL_Y, SKILL_WIDTH, Math.floor(SKILL_WIDTH / 2)); - // itemObj.on('pointerdown', () => ); - this.input.setDraggable(itemObj); - this.add.existing(itemObj); - }; - construct.skills.forEach(knownSkill); - this.add.text(X + WIDTH * 0.35, Y, 'Skills', TEXT.HEADER); - - this.add.text(X + WIDTH * 0.35, Y + HEIGHT * 0.25, 'Specs', TEXT.HEADER); - const knownSpec = (spec, i) => { - const SKILL_X = X + WIDTH * 0.4 + WIDTH * 0.125 * i; - const SKILL_Y = Y + HEIGHT * 0.4; - const itemObj = new Item(this, spec, i, SKILL_X, SKILL_Y, SKILL_WIDTH, Math.floor(SKILL_WIDTH / 2)); - // itemObj.on('pointerdown', () => ); - this.input.setDraggable(itemObj); - this.add.existing(itemObj); - }; - construct.specs.forEach(knownSpec); - - - this.input.on('drag', (pointer, item, dragX, dragY) => { - if (!(item instanceof Item)) return false; - item.setPosition(dragX, dragY); - const hitBox = itemCheckHitbox(this, pointer); - if (hitBox) hitBox.itemSelect(); - return true; - }); - - this.input.on('dragend', (pointer, item) => { - if (!(item instanceof Item)) return false; - item.setPosition(item.origX, item.origY); - const hitBox = itemCheckHitbox(this, pointer); - if (hitBox) { - hitBox.itemDeselect(); - // add socket function for unlearn here - ws.sendVboxUnequip(vbox.instance, construct.id, item.item); - } - return true; - }); - */ - return this; - } - - cleanUp() { - this.registry.events.off('changedata', this.updateData, this); - this.scene.remove(); - } -} - -module.exports = StatSheet; diff --git a/phaser-client/src/scenes/zone.controls.js b/phaser-client/src/scenes/zone.controls.js deleted file mode 100644 index bdbd4b4c..00000000 --- a/phaser-client/src/scenes/zone.controls.js +++ /dev/null @@ -1,41 +0,0 @@ -const Phaser = require('phaser'); - -const { TEXT, POSITIONS: { MENU_MAIN } } = require('./constants'); - -const X = MENU_MAIN.x(); -const Y = MENU_MAIN.y(); -const WIDTH = MENU_MAIN.width(); -const HEIGHT = MENU_MAIN.height(); - -class ZoneControls extends Phaser.Scene { - constructor() { - super({ key: 'ZoneControls' }); - } - - create(zoneId) { - this.cameras.main.setViewport(X, Y, WIDTH, HEIGHT); - - const menu = this.add - .rectangle(Math.floor(WIDTH * 0.7), Math.floor(HEIGHT * 0.8), Math.floor(WIDTH * 0.2), Math.floor(HEIGHT * 0.2), 0x888888) - .setInteractive() - .setOrigin(0); - - this.add - .text(menu.getCenter().x, menu.getCenter().y, 'Clear', TEXT.HEADER) - .setOrigin(0.5, 0.5); - - menu.on('pointerdown', () => { - this.registry.get('ws').sendZoneClose(zoneId); - this.scene.get('Zones').cleanUp(); - }); - - - return true; - } - - cleanUp() { - this.scene.remove(); - } -} - -module.exports = ZoneControls; diff --git a/phaser-client/src/scenes/zone.node.js b/phaser-client/src/scenes/zone.node.js deleted file mode 100644 index cd81e4cd..00000000 --- a/phaser-client/src/scenes/zone.node.js +++ /dev/null @@ -1,31 +0,0 @@ -const Phaser = require('phaser'); - -class ZoneNode extends Phaser.GameObjects.Sprite { - constructor(scene, x, y, id, success, tag) { - super(scene, x, y); - this.setTexture('eye'); - this.scene = scene; - this.success = success; - // this.text = (text.indexOf(',') > -1) ? text.split(',') : text; - this.id = id; - this.setPosition(x, y); - - const nodeNoDigits = tag.replace(/[0-9]/g, ''); - switch (nodeNoDigits) { - case 'BOSS': - this.setScale(0.25); - break; - case 'MINIBOSS': - this.setScale(0.1); - break; - default: - this.setScale(0.05); - } - if (this.success) { - this.setTint(0xff0000); - } - this.text = tag; - } -} - -module.exports = ZoneNode; diff --git a/phaser-client/src/scenes/zones.js b/phaser-client/src/scenes/zones.js deleted file mode 100644 index fcedab65..00000000 --- a/phaser-client/src/scenes/zones.js +++ /dev/null @@ -1,129 +0,0 @@ -const Phaser = require('phaser'); -const Node = require('./zone.node'); -const ZoneControls = require('./zone.controls'); -const { POSITIONS: { MENU_MAIN }, TEXT } = require('./constants'); - -const X = MENU_MAIN.x(); -const Y = MENU_MAIN.y(); -const WIDTH = MENU_MAIN.width(); -const HEIGHT = MENU_MAIN.height(); - - -// Mouse click hold to move, Q + E to zoom in and out -// Press 'A' to reset allocated passive nodes - -class Zones extends Phaser.Scene { - constructor() { - super({ key: 'Zones' }); - } - - preload() { - this.load.image('eye', 'https://labs.phaser.io/assets/particles/green-orb.png'); - } - - create(zone) { - if (!zone) return false; - if (!this.scene.get('ZoneControls')) this.scene.manager.add('ZoneControls', ZoneControls, true, zone.id); - this.graphics = this.add.graphics(); - this.cameras.main.setViewport(X, Y, WIDTH, HEIGHT); - this.addNodes(zone.graph.nodes); - this.drawEdges(zone.graph.edges); - this.addCameraControl(); - this.addEvents(zone.id); - return this; - } - - addNodes(nodeData) { - this.nodes = []; - nodeData.forEach((n, i) => { - this.nodes[i] = this.add.existing( - new Node(this, n.x * 50 + 200, n.y * 50 + 200, i, n.success, n.tag) - ).setInteractive(); - }); - } - - addCameraControl() { - this.controls = new Phaser.Cameras.Controls.SmoothedKeyControl({ - camera: this.cameras.main, - zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q), - zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E), - acceleration: 0.005, - drag: 0.0005, - maxSpeed: 0.001, - }); - } - - addEvents(zoneId) { - this.input.on('pointerover', (pointer, gameObjects) => { - if (gameObjects[0] instanceof Node) { - this.displayNodeText(gameObjects[0], pointer); - } - }); - this.input.on('pointerout', (pointer, gameObjects) => { - if (gameObjects[0] instanceof Node) { - this.nodeText.destroy(); - } - }); - this.input.on('pointerup', (pointer, gameObjects) => { - if (Math.abs(pointer.upX - pointer.downX) < 5 - && Math.abs(pointer.upY - pointer.downY) < 5) { - // Check cursor hasn't significantly moved during point allocation - // If panning and mouse release is on node it won't allocate - if (gameObjects[0] instanceof Node) { - const team = this.registry.get('constructs').filter(c => c.active).map(c => c.id); - if (gameObjects[0].success) return false; - this.registry.get('ws').sendZoneJoin(zoneId, gameObjects[0].id, team); - } - } - return true; - }); - this.input.on('pointermove', (pointer) => { - const zoomFactor = 2 / this.cameras.main.zoom; - if (this.registry.get('pan')) { - const points = pointer.getInterpolatedPosition(2); - this.cameras.main.scrollX -= zoomFactor * (points[1].x - points[0].x); - this.cameras.main.scrollY -= zoomFactor * (points[1].y - points[0].y); - } - }, this); - } - - drawEdges(edgeData) { - this.graphics.clear(); - edgeData.forEach((e) => { - const nodeA = this.nodes[e[0]]; - const nodeB = this.nodes[e[1]]; - if (nodeA.success && nodeB.success) { - this.graphics.lineStyle(10, 0xfff00f, 0.2); - } else { - this.graphics.lineStyle(2, 0xffffff, 0.2); - } - this.graphics.lineBetween(nodeA.x, nodeA.y, nodeB.x, nodeB.y); - return true; - }); - } - - displayNodeText(node, pointer) { - if (this.nodeText) this.nodeText.destroy(); - this.nodeText = this.add.text(node.x, node.y, node.text, TEXT.HOVER).setPadding(32); - this.nodeText.setAlpha(0.8); - this.nodeText.setOrigin(pointer.x >= WIDTH * 0.65 ? 1 : 0, - pointer.y >= HEIGHT * 0.25 ? 1 : 0); - this.nodeText.setWordWrapWidth(450); - this.nodeText.setScale(1 / this.cameras.main.zoom); - } - - camPan(bool) { - this.pan = bool; - } - - update(delta) { - this.controls.update(delta); - } - - cleanUp() { - if (this.scene.get('ZoneControls')) this.scene.get('ZoneControls').cleanUp(); - this.scene.remove(); - } -} - -module.exports = Zones; diff --git a/phaser-client/src/socket.js b/phaser-client/src/socket.js deleted file mode 100644 index 26c58848..00000000 --- a/phaser-client/src/socket.js +++ /dev/null @@ -1,335 +0,0 @@ -const toast = require('izitoast'); -const cbor = require('borc'); - - -const SOCKET_URL = process.env.NODE_ENV === 'production' ? 'wss://constructs.gg/ws' : 'ws://localhost:40000'; - -function errorToast(err) { - console.error(err); - return toast.error({ - title: 'BEEP BOOP', - message: err, - position: 'topRight', - }); -} - -function createSocket(events) { - let ws; - - // handle account auth within the socket itself - // https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html - let account = null; - - // ------------- - // Outgoing - // ------------- - function send(msg) { - console.log('outgoing msg', msg); - msg.token = account && account.token; - ws.send(cbor.encode(msg)); - } - - function sendAccountLogin(name, password) { - send({ method: 'account_login', params: { name, password } }); - } - - function sendAccountCreate(name, password) { - send({ method: 'account_create', params: { name, password } }); - } - - function sendAccountDemo() { - send({ method: 'account_demo', params: {} }); - } - - function sendAccountConstructs() { - send({ method: 'account_constructs', params: {} }); - } - - function sendAccountInstances() { - send({ method: 'account_instances', params: {} }); - } - - function sendAccountZone() { - send({ method: 'account_zone', params: {} }); - } - - function sendConstructSpawn(name) { - send({ method: 'construct_spawn', params: { name } }); - } - - function sendConstructLearn(id, skill) { - send({ method: 'construct_learn', params: { id, skill } }); - } - - function sendConstructForget(id, skill) { - send({ method: 'construct_forget', params: { id, skill } }); - } - - function sendGameState(id) { - send({ method: 'game_state', params: { id } }); - } - - function sendGamePve(constructIds, mode) { - send({ method: 'game_pve', params: { construct_ids: constructIds, mode } }); - } - - function sendGamePvp(constructIds) { - send({ method: 'game_pvp', params: { construct_ids: constructIds } }); - } - - function sendGameJoin(gameId, constructIds) { - send({ method: 'game_join', params: { game_id: gameId, construct_ids: constructIds } }); - } - - function sendSpecForget(id, spec) { - send({ method: 'construct_unspec', params: { id, spec } }); - } - - function sendPlayerConstructsSet(instanceId, constructIds) { - send({ method: 'player_constructs_set', params: { instance_id: instanceId, construct_ids: constructIds } }); - } - - function sendPlayerState(instanceId) { - send({ method: 'player_state', params: { instance_id: instanceId } }); - } - - function sendVboxAccept(instanceId, group, index) { - send({ method: 'player_vbox_accept', params: { instance_id: instanceId, group, index } }); - } - - function sendVboxApply(instanceId, constructId, index) { - send({ method: 'player_vbox_apply', params: { instance_id: instanceId, construct_id: constructId, index } }); - } - - function sendVboxUnequip(instanceId, constructId, target) { - send({ method: 'player_vbox_unequip', params: { instance_id: instanceId, construct_id: constructId, target } }); - } - - function sendVboxDiscard(instanceId) { - send({ method: 'player_vbox_discard', params: { instance_id: instanceId } }); - } - - function sendVboxCombine(instanceId, indices) { - send({ method: 'player_vbox_combine', params: { instance_id: instanceId, indices } }); - } - - function sendVboxReclaim(instanceId, index) { - send({ method: 'player_vbox_reclaim', params: { instance_id: instanceId, index } }); - } - - function sendGameSkill(gameId, constructId, targetConstructId, skill) { - send({ - method: 'game_skill', - params: { - game_id: gameId, construct_id: constructId, target_construct_id: targetConstructId, skill, - }, - }); - events.setActiveSkill(null); - } - - function sendGameTarget(gameId, constructId, skillId) { - send({ method: 'game_target', params: { game_id: gameId, construct_id: constructId, skill_id: skillId } }); - events.setActiveSkill(null); - } - - function sendZoneCreate() { - send({ method: 'zone_create', params: {} }); - } - - function sendZoneJoin(zoneId, nodeId, constructIds) { - send({ method: 'zone_join', params: { zone_id: zoneId, node_id: nodeId, construct_ids: constructIds } }); - } - - function sendZoneClose(zoneId) { - send({ method: 'zone_close', params: { zone_id: zoneId } }); - } - - function sendInstanceJoin(constructs) { - send({ method: 'instance_join', params: { construct_ids: constructs, pve: true } }); - } - - function sendInstanceReady(instanceId) { - send({ method: 'instance_ready', params: { instance_id: instanceId } }); - } - - function sendInstanceScores(instanceId) { - send({ method: 'instance_scores', params: { instance_id: instanceId } }); - } - - - // ------------- - // Incoming - // ------------- - function accountLogin(res) { - const [struct, login] = res; - - account = login; - events.setAccount(login); - sendAccountConstructs(); - } - - function accountInstanceList(res) { - const [struct, instanceList] = res; - events.setInstanceList(instanceList); - } - - function accountConstructs(response) { - const [structName, constructs] = response; - events.setConstructList(constructs); - } - - function gameState(response) { - const [structName, game] = response; - events.setGame(game); - } - - function constructSpawn(response) { - const [structName, construct] = response; - } - - function gamePve(response) { - const [structName, game] = response; - } - - function zoneState(response) { - const [structName, zone] = response; - events.setZone(zone); - } - - function playerState(response) { - const [structName, player] = response; - events.setPlayer(player); - } - - function instanceScores(response) { - const [structName, scores] = response; - events.setScores(scores); - } - - // ------------- - // Setup - // ------------- - - // when the server sends a reply it will have one of these message types - // this object wraps the reply types to a function - const handlers = { - construct_spawn: constructSpawn, - construct_forget: () => true, - construct_learn: () => true, - game_pve: gamePve, - game_state: gameState, - account_login: accountLogin, - account_create: accountLogin, - account_constructs: accountConstructs, - account_instances: accountInstanceList, - instance_scores: instanceScores, - zone_create: res => console.log(res), - zone_state: zoneState, - zone_close: res => console.log(res), - player_state: playerState, - }; - - function errHandler(error) { - switch (error) { - case 'no active zone': return sendZoneCreate(); - case 'no constructs selected': return events.errorPrompt('select_constructs'); - case 'node requirements not met': return events.errorPrompt('complete_nodes'); - case 'construct at max skills (4)': return events.errorPrompt('max_skills'); - - default: return errorToast(error); - - } - } - - // decodes the cbor and - // calls the handlers defined above based on message type - function onMessage(event) { - // decode binary msg from server - const blob = new Uint8Array(event.data); - const res = cbor.decode(blob); - const { method, params } = res; - - console.log(res); - - // check for error and split into response type and data - if (res.err) return errHandler(res.err); - if (!handlers[method]) return errorToast(`${method} handler missing`); - return handlers[method](params); - } - - function connect() { - ws = new WebSocket(SOCKET_URL); - ws.binaryType = 'arraybuffer'; - - // Connection opened - ws.addEventListener('open', () => { - toast.info({ - message: 'connected', - position: 'topRight', - }); - - if (!account) events.loginPrompt(); - if (process.env.NODE_ENV !== 'production') { - // send({ method: 'account_login', params: { name: 'ntr', password: 'grepgrepgrep' } }); - } - - return true; - }); - - // Listen for messages - ws.addEventListener('message', onMessage); - - ws.addEventListener('error', (event) => { - console.error('WebSocket error', event); - // account = null; - // return setTimeout(connect, 5000); - }); - - ws.addEventListener('close', (event) => { - console.error('WebSocket closed', event); - toast.warning({ - message: 'disconnected', - position: 'topRight', - }); - return setTimeout(connect, 5000); - }); - - return ws; - } - - return { - sendAccountLogin, - sendAccountCreate, - sendAccountDemo, - sendAccountConstructs, - sendAccountInstances, - sendAccountZone, - sendGameState, - sendGamePve, - sendGamePvp, - sendGameJoin, - sendGameSkill, - sendGameTarget, - sendConstructSpawn, - sendConstructLearn, - sendConstructForget, - sendSpecForget, - sendZoneCreate, - sendZoneJoin, - sendZoneClose, - sendInstanceJoin, - sendInstanceReady, - sendInstanceScores, - sendPlayerConstructsSet, - sendPlayerState, - sendVboxAccept, - sendVboxApply, - sendVboxReclaim, - sendVboxCombine, - sendVboxDiscard, - sendVboxUnequip, - connect, - }; -} - -module.exports = createSocket; diff --git a/phaser-client/src/tutorial.js b/phaser-client/src/tutorial.js deleted file mode 100644 index 186927c7..00000000 --- a/phaser-client/src/tutorial.js +++ /dev/null @@ -1,135 +0,0 @@ -const toast = require('izitoast'); - -const OK_BUTTON = ''; -const NO_MORE_BUTTON = ''; - -function noMore(instance, thisToast) { - window.localStorage.setItem('tutorial', 'none'); - return instance.hide({ transitionOut: 'fadeOut' }, thisToast); -} - -const WELCOME_MESSAGE = ` -Welcome to constructs.gg -Enter a username and password and press register to sign up, -or just press DEMO to quick start. -`; - -const HOMEPAGE_MESSAGE = ` -This homepage shows your constructs, joinable online games, PVE options and your items.\n -If you have no constructs yet, press SPAWN and give your construct a name to create one. -Once you have made a construct, click on them to visit their stat page and teach them some SKILLS. -The stat page also has descriptions of each skill and their effects. -constructs have 3 basic stats: hp, red damage and magic damage. -Toggle whether a construct is selected for your team by clicking the coloured stripes next to the construct or press 1,2,3. -Once you have a team ready press the New PVE Game button to start playing. -`; - -const SKILL_PHASE_MESSAGE = ` -A constructs battle has two main phases. This first phase is called the SKILL PHASE. -Your constructs are positioned on the left, your opponent's are on the right. -In the centre are your constructs' SKILLS, grayed out SKILLS are currently ON COOLDOWN. -A skill's cooldown reduces on every turn that construct does not use a skill with a cooldown. -For the moment, drag ATTACK onto the opponent team to have your constructs attack them with red damage. -`; - -// const TARGET_PHASE_MESSAGE = ` -// This phase is the TARGET PHASE. -// In constructs you do not directly attack your opponent's constructs, you attack the opponent as a team -// and you and your opponent choose which construct is the TARGET of each ability. -// Drag the incoming ATTACKS from the right hand side onto your own constructs. -// It's wise to spread the damage around! -// `; - -const RESOLUTION_PHASE_MESSAGE = ` -The second phase is called the RESOLUTION PHASE. -This phase happens automatically, every skill is RESOLVED in order of its SPEED. -This is important because attacks only RESOLVE while their caster is still able to use the skill, -a fast skill that does a small amount of damage may KO an opponent construct, causing any SKILLS -they have used to no longer RESOLVE! -Another example of this is the skill STUN. STUN causes an opponent construct to be unable to use any -abilities for TWO TURNS including the turn it resolves on. In other words it lasts for the rest of the turn it resolves on -and the whole next turn. -Try it now! -`; - -const FINISH_PHASE_MESSAGE = ` -gg! The game has now concluded, if you were the winner you have been awarded with a STAT REROLL ITEM. -You can use this to reroll a stat on a construct which may be lacking. -A good metric is that if a stat is more than 1/2 of its STAMINA that's a good roll. -Now that you have learned the basics, press BACKSPACE to return to the main menu -and experiment with some combinations of SKILLS or replace the ones your constructs know in the STAT PAGE. -glhf! -`; - -const STEPS = [ - 'init', - 'welcome', - 'homepage', - 'skillPhase', - // 'targetPhase', - 'resolutionPhase', - 'finishPhase', - 'none', -]; - -function showTutorial(message, step, nextStep) { - const existing = document.querySelector(`#${step}`); // Selector of your toast - - if (existing) return false; - - toast.info({ - id: step, - theme: 'dark', - color: 'black', - timeout: false, - drag: false, - title: 'TUTORIAL', - position: 'bottomCenter', - maxWidth: window.innerWidth / 2, - close: false, - buttons: [ - [NO_MORE_BUTTON, noMore], - [OK_BUTTON, (instance, thisToast) => { - const thisStep = STEPS.indexOf(step); - const storageStep = STEPS.indexOf(window.localStorage.getItem('tutorial')); - if (thisStep >= storageStep) { - window.localStorage.setItem('tutorial', nextStep); - } - - return instance.hide({ transitionOut: 'fadeOut' }, thisToast); - }], - ], - message, - }); - - return true; -} - -function tutorial() { - function show(step) { - const currentStage = window.localStorage.getItem('tutorial'); - if (currentStage === 'none') { - return false; - } - - const thisStep = STEPS.indexOf(step); - const storageStep = STEPS.indexOf(window.localStorage.getItem('tutorial')); - - if (thisStep < storageStep) return false; - - if (step === 'welcome') return showTutorial(WELCOME_MESSAGE, 'welcome', 'homepage'); - if (step === 'homepage') return showTutorial(HOMEPAGE_MESSAGE, 'homepage', 'skillPhase'); - if (step === 'skillPhase') return showTutorial(SKILL_PHASE_MESSAGE, 'skillPhase', 'targetPhase'); - // if (step === 'targetPhase') return showTutorial(TARGET_PHASE_MESSAGE, 'targetPhase', 'resolutionPhase'); - if (step === 'resolutionPhase') return showTutorial(RESOLUTION_PHASE_MESSAGE, 'resolutionPhase', 'finishPhase'); - if (step === 'finishPhase') return showTutorial(FINISH_PHASE_MESSAGE, 'finishPhase', 'none'); - - return true; - } - - if (window.localStorage.getItem('tutorial') !== 'none') window.localStorage.setItem('tutorial', 'init'); - - return show; -} - -module.exports = tutorial; diff --git a/phaser-client/src/utils.js b/phaser-client/src/utils.js deleted file mode 100644 index e48b03ef..00000000 --- a/phaser-client/src/utils.js +++ /dev/null @@ -1,36 +0,0 @@ -const get = require('lodash/get'); - -const stringSort = (k, desc) => { - if (desc) { - return (a, b) => { - if (!get(a, k)) return 1; - if (!get(b, k)) return -1; - return get(b, k).localeCompare(get(a, k)); - }; - } - return (a, b) => { - if (!get(a, k)) return 1; - if (!get(b, k)) return -1; - return get(a, k).localeCompare(get(b, k)); - }; -}; - -const numSort = (k, desc) => { - if (desc) { - return (a, b) => { - if (!get(a, k)) return 1; - if (!get(b, k)) return -1; - return get(b, k) - get(a, k); - }; - } - return (a, b) => { - if (!get(a, k)) return 1; - if (!get(b, k)) return -1; - return get(a, k) - get(b, k); - }; -}; - -module.exports = { - stringSort, - numSort, -}; diff --git a/server/src/cryp.rs b/server/src/construct.rs similarity index 100% rename from server/src/cryp.rs rename to server/src/construct.rs From 7e2a95204ef15497e317f02403c9955cebdad522 Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 25 May 2019 15:52:37 +1000 Subject: [PATCH 13/18] more renaming --- client/src/components/login.component.jsx | 4 +-- client/src/components/login.container.jsx | 1 + client/src/components/spawn.button.jsx | 1 - ops/init_db.sh | 8 +++--- ops/knexfile.js | 4 +-- ....js => 20180916221309_constructs_table.js} | 0 ops/migrations/20181020104420_games.js | 10 ------- ops/migrations/20181228162012_zones.js | 28 ------------------- ...cryps.gg.nginx.conf => mnml.gg.nginx.conf} | 13 +++++---- server/.env | 2 +- server/Cargo.toml | 4 +-- server/src/account.rs | 5 ++-- server/src/main.rs | 2 +- 13 files changed, 23 insertions(+), 59 deletions(-) rename ops/migrations/{20180916221309_cryps_table.js => 20180916221309_constructs_table.js} (100%) delete mode 100644 ops/migrations/20181228162012_zones.js rename ops/{cryps.gg.nginx.conf => mnml.gg.nginx.conf} (68%) diff --git a/client/src/components/login.component.jsx b/client/src/components/login.component.jsx index 67b89685..3a2d7e2d 100644 --- a/client/src/components/login.component.jsx +++ b/client/src/components/login.component.jsx @@ -13,13 +13,13 @@ function renderLogin({ submitLogin, submitRegister }) { className="login-input" type="email" placeholder="username" - onChange={e => (details.name = e.target.value)} + onInput={e => details.name = e.target.value} /> (details.password = e.target.value)} + onInput={e => details.password = e.target.value} />

- Damage + Power
Speed diff --git a/client/src/test.game.js b/client/src/test.game.js index a6ddc397..a19f2182 100644 --- a/client/src/test.game.js +++ b/client/src/test.game.js @@ -19,9 +19,9 @@ function testGame(uuid) { ], [ "Speed", - "Damage", + "Power", "Life", - "Damage", + "Power", "Life", "Life" ] @@ -282,7 +282,7 @@ function testGame(uuid) { ], [ "Speed", - "Damage", + "Power", "Speed", "Life", "Speed", diff --git a/client/src/test.instance.js b/client/src/test.instance.js index 58a088e1..3c857ed9 100644 --- a/client/src/test.instance.js +++ b/client/src/test.instance.js @@ -22,9 +22,9 @@ function testInstance(uuid) { "Block" ], [ - "Damage", + "Power", "Life", - "Damage", + "Power", "Speed" ] ], @@ -308,7 +308,7 @@ function testInstance(uuid) { "Attack" ], [ - "Damage", + "Power", "Speed", "Life" ] @@ -886,7 +886,7 @@ function testInstance(uuid) { ], [ "Speed", - "Damage", + "Power", "Speed", "Speed" ] @@ -1174,7 +1174,7 @@ function testInstance(uuid) { "Debuff" ], [ - "Damage", + "Power", "Life", "Speed", "Speed" @@ -1466,7 +1466,7 @@ function testInstance(uuid) { "Speed", "Speed", "Speed", - "Damage" + "Power" ] ], "bound": [] @@ -1754,7 +1754,7 @@ function testInstance(uuid) { [ "Life", "Speed", - "Damage", + "Power", "Life" ] ], @@ -2044,7 +2044,7 @@ function testInstance(uuid) { "Speed", "Life", "Speed", - "Damage" + "Power" ] ], "bound": [] @@ -2622,7 +2622,7 @@ function testInstance(uuid) { "Life", "Speed", "Speed", - "Damage" + "Power" ] ], "bound": [] @@ -2908,10 +2908,10 @@ function testInstance(uuid) { "Stun" ], [ - "Damage", - "Damage", + "Power", + "Power", "Speed", - "Damage" + "Power" ] ], "bound": [] @@ -3197,10 +3197,10 @@ function testInstance(uuid) { "Stun" ], [ - "Damage", + "Power", "Speed", - "Damage", - "Damage" + "Power", + "Power" ] ], "bound": [] @@ -3486,9 +3486,9 @@ function testInstance(uuid) { "Buff" ], [ - "Damage", + "Power", "Speed", - "Damage", + "Power", "Life" ] ], @@ -4348,9 +4348,9 @@ function testInstance(uuid) { [ "Life", "Speed", - "Damage", + "Power", "Speed", - "Damage", + "Power", "Life" ] ], diff --git a/client/src/utils.jsx b/client/src/utils.jsx index 9407e47a..a044b2bf 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -113,18 +113,18 @@ function instanceConstruct(name, id) { const NULL_UUID = '00000000-0000-0000-0000-000000000000'; const STATS = { - redDamage: { - stat: 'red_damage', + redPower: { + stat: 'red_power', colour: 'red', svg: shapes.circle, }, - greenDamage: { - stat: 'green_damage', + greenPower: { + stat: 'green_power', colour: 'green', svg: shapes.circle, }, - blueDamage: { - stat: 'blue_damage', + bluePower: { + stat: 'blue_power', colour: 'blue', svg: shapes.circle, }, @@ -193,45 +193,45 @@ const SPECS = { svg: shapes.square }, - Damage: { + Power: { colour: 'white', - caption: 'Damage', + caption: 'Power', thresholds: [], svg: shapes.circle }, - RedDamageI: { + RedPowerI: { colour: 'red', - caption: 'DamageI', + caption: 'PowerI', thresholds: [5, 10, 20], svg: shapes.circle }, - BlueDamageI: { + BluePowerI: { colour: 'blue', - caption: 'DamageI', + caption: 'PowerI', thresholds: [5, 10, 20], svg: shapes.circle }, - GreenDamageI: { + GreenPowerI: { colour: 'green', - caption: 'DamageI', + caption: 'PowerI', thresholds: [5, 10, 20], svg: shapes.circle, }, GRDI: { colour: 'yellow', - caption: 'DamageI', + caption: 'PowerI', thresholds: [2, 5, 10], svg: shapes.circle }, GBDI: { colour: 'cyan', - caption: 'DamageI', + caption: 'PowerI', thresholds: [2, 5, 10], svg: shapes.circle, }, RBDI: { colour: 'purple', - caption: 'DamageI', + caption: 'PowerI', thresholds: [2, 5, 10], svg: shapes.circle, }, @@ -445,7 +445,7 @@ function getCombatSequence(event) { && (['Ruin', 'Taunt', 'Strangling', 'Parry'].includes(event[1].skill) || (event[1].skill === 'Decay' && event[1].effect === 'Wither'))) return ['POST_SKILL']; - if (['Damage'].includes(event[0]) + if (['Power'].includes(event[0]) && ((event[1].skill === 'Chaos' && event[1].colour === 'Red') || event[1].skill === 'Silence' || event[1].skill === 'Snare')) return ['POST_SKILL']; diff --git a/ops/migrations/20180916221309_constructs_table.js b/ops/migrations/20180916221309_constructs_table.js index 4f43203e..740f51d2 100755 --- a/ops/migrations/20180916221309_constructs_table.js +++ b/ops/migrations/20180916221309_constructs_table.js @@ -1,6 +1,7 @@ exports.up = async knex => { return knex.schema.createTable('constructs', table => { table.uuid('id').primary(); + table.timestamps(true, true); table.uuid('account').notNullable() table.foreign('account') .references('id') diff --git a/server/src/account.rs b/server/src/account.rs index 0fe7655b..765efe11 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -178,7 +178,8 @@ pub fn account_constructs(tx: &mut Transaction, account: &Account) -> Result Date: Sat, 25 May 2019 16:36:57 +1000 Subject: [PATCH 16/18] log file --- server/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main.rs b/server/src/main.rs index 996cbb44..7fcc6b52 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -51,7 +51,7 @@ fn setup_logger() -> Result<(), fern::InitError> { .level_for("tungstenite", log::LevelFilter::Info) .level(log::LevelFilter::Debug) .chain(std::io::stdout()) - .chain(fern::log_file("log/constructs.log")?) + .chain(fern::log_file("log/mnml.log")?) .apply()?; Ok(()) } From 21efb909fbfe89fa692c4494c634f0874b7c1564 Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 25 May 2019 16:45:39 +1000 Subject: [PATCH 17/18] fix login --- client/src/components/login.component.jsx | 15 +++++++-------- ops/mnml.gg.nginx.conf | 6 +++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/client/src/components/login.component.jsx b/client/src/components/login.component.jsx index 3a2d7e2d..3eb4a2d6 100644 --- a/client/src/components/login.component.jsx +++ b/client/src/components/login.component.jsx @@ -1,11 +1,10 @@ // eslint-disable-next-line const preact = require('preact'); +const { useState } = require('preact/hooks'); function renderLogin({ submitLogin, submitRegister }) { - const details = { - name: '', - password: '', - }; + const [name, setName] = useState(''); + const [password, setPassword] = useState(''); return (
@@ -13,22 +12,22 @@ function renderLogin({ submitLogin, submitRegister }) { className="login-input" type="email" placeholder="username" - onInput={e => details.name = e.target.value} + onInput={e => setName(e.target.value)} /> details.password = e.target.value} + onInput={e => setPassword(e.target.value)} />
diff --git a/ops/mnml.gg.nginx.conf b/ops/mnml.gg.nginx.conf index 8514a380..55a25a4a 100644 --- a/ops/mnml.gg.nginx.conf +++ b/ops/mnml.gg.nginx.conf @@ -8,7 +8,7 @@ map $http_upgrade $connection_upgrade { } server { - root /home/git/cryps/client/dist/; + root /home/git/mnml/client/dist/; index index.html; server_name mnml.gg; # managed by Certbot @@ -17,6 +17,10 @@ server { return 301 https://mnml.gg$request_uri; } # managed by Certbot + if ($host = cryps.gg) { + return 301 https://mnml.gg$request_uri; + } # managed by Certbot + location / { try_files $uri $uri/ =404; } From e20b1f25a586eb38a47475a829c4b916948e48ed Mon Sep 17 00:00:00 2001 From: ntr Date: Sat, 25 May 2019 16:55:55 +1000 Subject: [PATCH 18/18] invites button --- client/assets/styles/styles.css | 5 +++++ client/index.html | 2 +- client/src/components/login.component.jsx | 5 +++++ server/src/account.rs | 1 - 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/client/assets/styles/styles.css b/client/assets/styles/styles.css index d6736a5e..9bb63d57 100644 --- a/client/assets/styles/styles.css +++ b/client/assets/styles/styles.css @@ -170,6 +170,11 @@ button.left:hover, button.left:focus { box-shadow: inset 0.5em 0 0 0 whitesmoke; } +a { + color: whitesmoke; + font-size: 150%; +} + svg { fill: none; stroke: whitesmoke; diff --git a/client/index.html b/client/index.html index 259100d0..f2a78170 100644 --- a/client/index.html +++ b/client/index.html @@ -1,7 +1,7 @@ - mnml pvp tbs + mnml.gg diff --git a/client/src/components/login.component.jsx b/client/src/components/login.component.jsx index 3eb4a2d6..41465585 100644 --- a/client/src/components/login.component.jsx +++ b/client/src/components/login.component.jsx @@ -30,6 +30,11 @@ function renderLogin({ submitLogin, submitRegister }) { onClick={() => submitRegister(name, password)}> Register +
); } diff --git a/server/src/account.rs b/server/src/account.rs index 765efe11..1b52d537 100644 --- a/server/src/account.rs +++ b/server/src/account.rs @@ -61,7 +61,6 @@ pub fn account_from_token(token: String, tx: &mut Transaction) -> Result Result { let id = Uuid::new_v4(); - info!("{:?} {:?}", params.password, params.password.len()); if params.password.len() < PASSWORD_MIN_LEN { return Err(err_msg("password must be at least 12 characters")); }