Started equipment; need to rework state system

This commit is contained in:
2019-05-31 02:12:35 +10:00
parent dd3f18f7d1
commit b97d8fc184
8 changed files with 210 additions and 21 deletions
+45
View File
@@ -0,0 +1,45 @@
//environment variables
require('dotenv').config();
//utilities
let { log } = require('../common/utilities.js');
//the statistics
let equipmentStatistics = require('./equipment_statistics.json');
const statisticsRequest = () => (req, res) => {
res.status(200).json(equipmentStatistics);
res.end();
}
const listRequest = (connection) => (req, res) => {
//verify identity
let query = 'SELECT accountId FROM sessions WHERE accountId IN (SELECT id FROM accounts WHERE username = ?) AND token = ?;';
connection.query(query, [req.body.username, req.body.token], (err, results) => {
if (err) throw err;
let query = 'SELECT name, quantity, type FROM equipment WHERE accountId = ?;';
connection.query(query, [results[0].accountId], (err, results) => {
if (err) throw err;
//transform the results into a sendable array
let list = {};
results.map((record) => {
//initialize this type
list[record.type] = list[record.type] || {};
//send the quantity of every type
list[record.type][record.name] = record.quantity;
});
res.status(200).json(list);
res.end();
});
});
}
module.exports = {
statisticsRequest: statisticsRequest,
listRequest: listRequest
}
-19
View File
@@ -1,19 +0,0 @@
let weapons = [
{ name: 'Stick', cost: 50, boost: 0.02, level: 1 },
{ name: 'Dagger', cost: 75, boost: 0.03, level: 2 },
{ name: 'Sword', cost: 100, boost: 0.04, level: 3 },
{ name: 'Longsword', cost: 150, boost: 0.05, level: 4 },
{ name: 'Frying Pan', cost: 200, boost: 0.06, level: 5 },
];
let armour = [
{ name: 'leather', cost: 75, boost: 0.02, level: 2 },
{ name: 'gambeson', cost: 100, boost: 0.03, level: 3 },
{ name: 'chainmail', cost: 150, boost: 0.04, level: 4 },
{ name: 'platemail', cost: 200, boost: 0.05, level: 5 },
];
module.exports = {
weapons: weapons,
armour: armour
};
+15
View File
@@ -0,0 +1,15 @@
{
"Weapons": {
"Stick": { "cost": 50, "combatBoost": 0.02, "scientists": 1 },
"Dagger": { "cost": 75, "combatBoost": 0.03, "scientists": 2 },
"Sword": { "cost": 100, "combatBoost": 0.04, "scientists": 3 },
"Longsword": { "cost": 150, "combatBoost": 0.05, "scientists": 4 },
"Frying Pan": { "cost": 200, "combatBoost": 0.06, "scientists": 5 }
},
"Armour": {
"Leather": { "cost": 75, "combatBoost": 0.02, "scientists": 2 },
"Gambeson": { "cost": 100, "combatBoost": 0.03, "scientists": 3 },
"Chainmail": { "cost": 150, "combatBoost": 0.04, "scientists": 4 },
"Platemail": { "cost": 200, "combatBoost": 0.05, "scientists": 5 }
}
}
+4
View File
@@ -46,6 +46,10 @@ app.post('/attackstatusrequest', combat.attackStatusRequest(connection));
app.post('/combatlogrequest', combat.combatLogRequest(connection));
combat.runCombatTick(connection);
let equipment = require('./equipment.js');
app.post('/equipmentstatisticsrequest', equipment.statisticsRequest());
app.post('/equipmentlistrequest', equipment.listRequest(connection));
//static directories
app.use('/styles', express.static(path.resolve(__dirname + '/../public/styles')) );
app.use('/img', express.static(path.resolve(__dirname + '/../public/img')) );
+15
View File
@@ -93,3 +93,18 @@ CREATE TABLE IF NOT EXISTS pastCombat (
CONSTRAINT FOREIGN KEY fk_attackerId(attackerId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT FOREIGN KEY fk_defenderId(defenderId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
);
#equipment system
CREATE TABLE IF NOT EXISTS equipment (
id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY UNIQUE,
td TIMESTAMP DEFAULT CURRENT_TIMESTAMP(),
accountId INTEGER UNSIGNED,
name VARCHAR(50),
quantity INTEGER,
type VARCHAR(50),
CONSTRAINT FOREIGN KEY fk_accountId(accountId) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE
);
+18 -1
View File
@@ -7,6 +7,7 @@ import queryString from 'query-string';
//panels
import CommonLinks from '../panels/common_links.jsx';
import AttackButton from '../panels/attack_button.jsx';
import Equipment from '../panels/equipment.jsx';
import CombatLog from '../panels/combat_log.jsx';
class Profile extends React.Component {
@@ -27,12 +28,24 @@ class Profile extends React.Component {
warning: '',
start: params.log
//combat log
start: params.log,
//equipment
fetchStatistics: null,
fetchEquipment: null
};
this.sendRequest('/profilerequest', this.state.params.username ? this.state.params.username : this.props.username);
}
componentDidUpdate(prevProps, prevState, snapshot) {
if (JSON.stringify(this.state) !== JSON.stringify(prevState)) {
// if (this.state.fetchStatistics) this.state.fetchStatistics();
// if (this.state.fetchEquipment) this.state.fetchEquipment();
}
}
render() {
let warningStyle = {
display: this.state.warning.length > 0 ? 'flex' : 'none'
@@ -197,6 +210,10 @@ class Profile extends React.Component {
</div>
</div>
<br />
<h1 className='centered'>Equipment</h1>
<Equipment username={this.props.username} token={this.props.token} scientists={1} getFetchSattistics={ (fn) => this.setState({ fetchStatistics: fn }) } getFetchEquipment={ (fn) => this.setState({ fetchEquipment: fn}) } />
<br />
<h1 className='centered'>Combat Log</h1>
<CombatLog username={this.props.username} start={this.state.start} length={this.state.length} />
+112
View File
@@ -0,0 +1,112 @@
import React from 'react';
import PropTypes from 'prop-types';
class Equipment extends React.Component {
constructor(props) {
super(props);
this.state = {
statistics: {},
equipment: {}
};
if (this.props.getFetchStatistics) {
// this.props.getFetchStatistics(this.fetchStatistics.bind(this));
}
this.fetchStatistics();
if (this.props.getFetchEquipment) {
// this.props.getFetchEquipment(this.fetchEquipmentList.bind(this));
}
this.fetchEquipmentList();
}
render() {
//print the purchasable weapons, then purchasable armour, then stuff you can't buy
let statistics = JSON.parse(JSON.stringify(this.state.statistics));
//filter out what you can't get at your current scientist count
Object.keys(statistics).forEach((typeKey) => {
Object.keys(statistics[typeKey]).forEach((nameKey) => {
if (statistics[typeKey][nameKey].scientists > this.props.scientists) {
delete statistics[typeKey][nameKey];
}
if (Object.keys(statistics[typeKey]).length === 0) {
delete statistics[typeKey];
}
});
});
console.log(this.state.statistics);
console.log(statistics);
return (
<div className='panel'>
<div className='table'>
<div className='row'>
<p className='col'>Equipment Name</p>
<p className='col'>Equipment Type</p>
<p className='col'>Quantity</p>
<p className='col'>Cost</p>
<p className='col'>Buy</p>
<p className='col'>Sell</p>
</div>
</div>
</div>
);
}
fetchStatistics() {
//build the XHR
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
let data = JSON.parse(xhr.responseText);
this.setState({ statistics: data });
}
}
}
xhr.open('POST', '/equipmentstatisticsrequest', true);
xhr.send();
}
fetchEquipmentList(username = this.props.username, token = this.props.token) {
//build the XHR
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
let data = JSON.parse(xhr.responseText);
this.setState({ equipment: data });
}
}
}
xhr.open('POST', '/equipmentlistrequest', true);
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
xhr.send(JSON.stringify({
username: username,
token: token
}));
}
};
Equipment.propTypes = {
username: PropTypes.string.isRequired,
token: PropTypes.number.isRequired,
scientists: PropTypes.number.isRequired,
getFetchStatistics: PropTypes.func,
getFetchEquipmentList: PropTypes.func
};
export default Equipment;
+1 -1
View File
@@ -24,7 +24,7 @@ module.exports = {
]
},
optimization: {
minimize: true,
minimize: false,
minimizer: [
new TerserPlugin({
terserOptions: {