User input added

master
dabbott 2 years ago
parent b2f25ca029
commit 4505d544c3

4
.gitignore vendored

@ -118,4 +118,6 @@ dist
.yarn/install-state.gz
.pnp.*
webserver/mapImages/*
webServer/mapImages
config.js

@ -13,16 +13,13 @@ function percentify(lower,upper,input){
return input*100/upper
}
function chooseOwner(){
let owner
count = 0
playingUsers = []
let playingUsers = []
Object.keys(userObj).forEach(user => {
if (userObj[user].readyState){
count += config.genesisCreaturesPerUser
if (userObj[user]["readyState"]){
playingUsers.push(user)
}
})
owner = playingUsers[(creatureArr.length % playingUsers.length)]
let owner = playingUsers[(creatureArr.length % playingUsers.length)]
userObj[owner].addCreature()
return owner
}
@ -58,8 +55,6 @@ class Creature {
this.births = 0
this.alive = true
this.colour = colour || [Math.floor(Math.random()*255),Math.floor(Math.random()*255),Math.floor(Math.random()*255)]
creaturesObj[this._id] = this
}
synapses = {
input: {
@ -411,14 +406,14 @@ class Creature {
userObj[this.owner].takeCreature()
this.alive = false
// worldObj.checkBlocked(this.location)
if (worldObj.tiles[JSON.stringify(this.location)] !== undefined){
if (worldObj.tiles[JSON.stringify(this.location)].creature !== undefined){
worldObj.tiles[JSON.stringify(this.location)].creature = {}
}
if (worldObj.checkCreature(this.location)){
worldObj.tiles[JSON.stringify(this.location)].creature = {}
} else {
console.log(this.fullName+" does not have a tile!")
}
this.location = [null, null]
messageObj.add("Death",(this.fullName+" died because "+deathReason))
}
this.location = [null, null]
messageObj.add("Death",(this.fullName+" died because "+deathReason))
return 0
}
}

@ -1,33 +1,35 @@
const { v4: uuidv4 } = require('uuid')
userObj = require("../storageObjects/userObj")
worldObj = require("../storageObjects/worldObj")
creatureArr = require("../storageObjects/creatureArr")
mongo = require("../mongoHelp")
class User {
constructor(name, pass){
this._id = uuidv4()
constructor(name, pass, id, energy, powers){
this._id = id ||uuidv4()
this.name = name || "Nobody"
this.pass = pass
this.energy = 0
this.energy = energy || 0
this.creatures = 0
this.livingCreatures = 0
this.deadCreatures = 0
this.mutants = 0
this.killedCreatures = 0
this.readyState = true
this.powers = {
setPlayerPower: false,
transferEnergy: true,
createCreature: false,
killCreature: false,
mateCreature: false,
mutateCreature: false,
feedCreature: false,
growFood: false,
deleteFood: false
this.powers = powers || {
setPlayerPower: [false,0],
transferEnergy: [true,config.powers.transferEnergyBuyCost],
saveCreature: [false,config.powers.saveCreatureBuyCost],
spawnCreature: [false,config.powers.spawnCreatureBuyCost],
mutateCreature: [false,config.powers.mutateCreatureBuyCost],
feedCreature: [false,config.powers.feedCreatureBuyCost],
growFood: [false,config.powers.growFoodBuyCost],
deleteFood: [false,config.powers.deleteFoodBuyCost],
bomb: [false,config.powers.bombBuyCost]
}
userObj[name] = this
userObj[this.name] = this
this.initialSaveCheck()
}
addEnergy(energy){
this.energy += energy
@ -55,15 +57,76 @@ class User {
addMutant(){
this.mutants += 1
}
bomb(location, radius){
if(this.powers.bomb[0]){
let energyCost = (Math.round(radius*3.14)*3000)
if(this.spendEnergy(energyCost)){
let count = 0
for (let x = 0; x < radius; x++){
for (let y = 0; y < radius; y++){
let compx = x
let compy = y
if (x < 0){
compx *= -1
}
if (y < 0){
compy *= -1
}
let listArr = []
// TODO make the exposions circles and not squares
// compx+compy <= radius && location[0]+x > 0 && location[1]+y > 0 && location[0]+x < 100 && location[1]+y < 100
if(true){
listArr.push([location[0]+x,location[1]+y])
listArr.push([location[0]+x,location[1]-y])
listArr.push([location[0]-x,location[1]+y])
listArr.push([location[0]-x,location[1]-y])
}
listArr.forEach(tile => {
let killedArr = creatureArr.filter(creature => (creature.location[0] == tile[0]) && (creature.location[1] == tile[1]))
killedArr.forEach(creature => {
console.log(creature.fullName)
creature.die("they blew up")
})
})
// let dx = x - location[0]
// let dy = y - location[1]
// if ((radius*radius) <= (dx * dx + dy * dy)){
// console.log(x + y * radius)
// }
}
}
console.log(count)
} else return false
} else return false
}
purchasePower(powerName){
console.log(this.powers[Object.keys(this.powers).filter(power => power == powerName)][1])
this.spendEnergy(this.powers[Object.keys(this.powers).filter(power => power == powerName)][1])
this.powers[powerName][0] = true
}
clean(){
this.creatures = 0
this.livingCreatures = 0
this.deadCreatures = 0
this.mutants = 0
this.killedCreatures = 0
// this.readyState = false
this.readyState = false
mongo.update("algoZoo", "users", {_id:this._id}, this)
}
initialSaveCheck(){
mongo.get("algoZoo", "users",{_id: this._id}).then(list => {
if (list.length == 0){
mongo.put("algoZoo", "users",this)
} else {
mongo.update("algoZoo", "users",{_id: this._id}, this)
}
})
}
}
module.exports = User

@ -1,3 +1,4 @@
const User = require("./classes/userClass")
config = require("../config")
@ -7,9 +8,8 @@ messageObj = require("./storageObjects/messagesObj")
creaturesObj = require("./storageObjects/creatureObj")
creatureArr = require("./storageObjects/creatureArr")
svg = require("../webServer/gameSVG")
mongo = require("./mongoHelp")
Creature = require("./classes/creatureClass")
User = require("./classes/userClass")
@ -24,22 +24,29 @@ function setupGame(){
setTimeout(() => {
numCreatures = 0
Object.keys(userObj).forEach((user) => {
if(userObj[user].readyState == true){
if(userObj[user]["readyState"] == true){
numCreatures += config.genesisCreaturesPerUser
}
})
console.log(numCreatures, Object.keys(userObj).length)
console.log("Spawning "+numCreatures+" creatures")
for (let index = 0; index < numCreatures; index++) {
creatureArr.push(new Creature())
}
}, config.timers.preGame*0.75)
setTimeout(() => {
return resolve(true)
if (creatureArr.length == 0){
return reject(false)
} else {
svg.setup()
return resolve(true)
}
}, config.timers.preGame);
})
}
function gameLoop(){
return new Promise((resolve,reject) => {
loop = setInterval(() => {
@ -47,7 +54,6 @@ function gameLoop(){
creatureArr.forEach((creature, index) => {
creature.act()
if (!creature.alive){
delete creaturesObj[creature._id]
deadCreatureCount +=1
creatureArr.splice(index,1)
}
@ -62,11 +68,11 @@ function gameLoop(){
messageObj.wipe()
if (creatureArr.length == 0){
console.log("All Dead")
resolve(true)
Object.keys(userObj).forEach(user => {
userObj[user].clean()
})
clearInterval(loop)
return resolve(true)
} else {
console.log(creatureArr[0].fullName, creatureArr[0].location,creatureArr[0].energy+"/"+creatureArr[0].maxEnergy, creatureArr[0].age+"/"+creatureArr[0].maxAge, creatureArr[0].generation,creatureArr[0].births,creatureArr[0].kills)
}
@ -81,6 +87,7 @@ function gifGen(){
})
}
function recurse(){
setupGame().then(() => {
gameLoop().then(()=> {
@ -90,7 +97,16 @@ function recurse(){
//
// })
})
}).catch(issue => {
setTimeout(() => {
recurse()
}, config.timers.preGame);
})
}
recurse()
mongo.get("algoZoo", "users", {readyState: true}).then(userArr => {
userArr.forEach(user => {
new User(user.name, user.pass,user._id, user.energy, user.powers)
})
recurse()
})

@ -0,0 +1,16 @@
userObj = require("./storageObjects/userObj.js")
function handleAction(actionObj, user){
switch (actionObj.action) {
case "buy":
userObj[user.data.name].purchasePower(actionObj.power)
return {status: "Done!"}
case "bomb":
userObj[user.data.name].bomb(actionObj.location, actionObj.radius)
return {status: "Done!"}
default:
break;
}
}
module.exports = handleAction

@ -1,2 +1,2 @@
creaturesObj = {}
module.exports = creaturesObj
// creaturesObj = {}
// module.exports = creaturesObj

@ -2,6 +2,8 @@ config = require("../../config")
const { v4: uuidv4 } = require('uuid')
svg = require("../../webServer/gameSVG")
userObj = require("../storageObjects/userObj")
worldObj = {
tiles: {},
@ -41,7 +43,7 @@ worldObj = {
if (typeof worldObj.tiles[JSON.stringify(arr)].creature.fullName == "undefined"){
return false
} else {
return true
return worldObj.tiles[JSON.stringify(arr)].creature.fullName
}
},
checkTileFoodLevel: (arr)=> {
@ -53,11 +55,10 @@ worldObj = {
clean: () => {
delete worldObj.tiles
delete worldObj.id
worldObj.id = uuidv4()
worldObj.tiles = {}
worldObj.universe += 1
worldObj.step = 0
worldObj.id = uuidv4()
svg.setup()
worldObj.step = 0
}
}
module.exports = worldObj

@ -12,51 +12,72 @@ User = require("../classes/userClass")
function register(name,password){
return new Promise((resolve,reject) => {
bcrypt.hash(password, saltRounds).then(hash => {
let user = new User(name,hash)
userObj[user.name] = user
resolve(makeAuthToken(user.name,user.tokens))
mongo.get("algoZoo", "users", {name: name}).then(userArr => {
if (userArr.length != 0){
return reject("User exists")
} else {
let user = new User(name,hash)
resolve(makeAuthToken(user._id,user.name))
}
})
})
})
}
// register("Nobody", "StrongPass")
register("dabbott", config.secret)
register("2ndUser", config.secret)
// register("dabbott", config.secret)
exports.register = register
function login(name,password){
return new Promise((resolve,reject) => {
Object.keys(userObj).forEach((id, index) => {
if (name == userObj[id].name){
bcrypt.compare(password, userObj[id].password).then(res => {
mongo.get("algoZoo", "users", {name: name}).then(userArr => {
userArr.forEach(userDetail => {
if (name == userDetail.name){
if (res) {
resolve(makeAuthToken(userObj[id].id, userObj[id].name, userObj[id].tokens))
}
}).catch(e => {reject(e)})
}
bcrypt.compare(password, userDetail.pass).then(res => {
if (res) {
if (!userObj[name]){
new User(userDetail.name, userDetail.pass, userDetail._id, userDetail.energy, userDetail.powers)
} else {
userObj[name].readyState = true
}
resolve(makeAuthToken(userDetail._id, userDetail.name))
}
}).catch(e => {reject(e)})
}
})
// todo: looks like the foreach is being asyncy but it shouldn't be, so we're adding a time out, even if it's wrong
setTimeout(() => {
reject("x")
}, 3000);
})
// reject("No Login")
})
}
exports.login = login
function makeAuthToken(id){
function makeAuthToken(id, name){
return jwt.sign({
data: {
name: id
id: id,
name: name
}
}, config.secret, { expiresIn: '48h' })
}
function getUser(id){
if (userObj[id] !== undefined){
clone = JSON.parse(JSON.stringify(userObj[id]))
function getUser(name){
if (userObj[name] !== undefined){
clone = JSON.parse(JSON.stringify(userObj[name]))
delete clone.password
return clone
} else {

@ -1 +1,2 @@
require("./webServer/express")
require("./game/gameControl.js")

@ -1,16 +1,19 @@
express = require('express')
const jwt = require('jsonwebtoken')
mongo = require("../game/mongoHelp")
config = require("../config")
creatureObj = require("../game/gameControl")
require("./websocket.js")
creatureArr = require("../game/storageObjects/creatureArr")
worldObj = require("../game/storageObjects/worldObj")
messageObj = require("../game/storageObjects/messagesObj")
userObj = require("../game/storageObjects/userObj")
svg = require("./gameSVG")
userManage = require("../game/userManage/userManage")
handleAction = require('../game/handleAction')
const app = express()
@ -34,21 +37,43 @@ const authenticateJWT = (req, res, next) => {
}
}
app.use(function (req, res, next) {
app.use(express.json(),function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Allow-Methods', 'GET, POST')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Access-Control-Allow-Methods', '*')
res.setHeader('Access-Control-Allow-Headers', '*')
res.setHeader('Content-Type', 'application/json')
res.setHeader('Access-Control-Allow-Credentials', true)
next()
})
app.get('/creatures', function (req, res) {
res.send(JSON.stringify(creatureArr))
liteArr = JSON.parse(JSON.stringify(creatureArr))
liteArr.forEach(creature => {
delete creature.synapses
delete creature.name
delete creature.parentName
delete creature.surName
delete creature.brain
delete creature.facingDirection
delete creature.frontLoc
delete creature.rightLoc
delete creature.behindLoc
delete creature.leftLoc
delete creature.speed
delete creature.brainSize
delete creature.brainComplexity
delete creature.activationValue
delete creature.oscillatorFrequency
delete creature.eatFoodLevel
delete creature.alive
})
res.send(JSON.stringify(liteArr))
// res.send(JSON.stringify(creatureArr))
})
app.get('/creature/:creatureID', function (req, res) {
res.send(JSON.stringify(creatureObj[req.params.creatureID]))
res.send(JSON.stringify(creatureArr.find(creature => creature._id == req.params.creatureID)))
})
app.get('/world', function (req, res) {
@ -101,11 +126,21 @@ app.get('/worldMap', function (req, res) {
})
app.post('/login', (req, res) => {
user.login(req.body.name, req.body.password).then(jwt => {res.send(JSON.stringify(jwt))}).catch(e => {res.send(JSON.stringify(errorObj)); console.log(e)})
userManage.login(req.body.name, req.body.pass).then(jwt => {res.send(JSON.stringify(jwt))}).catch(e => {
res.status(401)
res.send(JSON.stringify(e))
})
})
app.post('/action',authenticateJWT,(req, res) => {
app.post('/register', (req, res) => {
userManage.register(req.body.name, req.body.pass).then(jwt => {res.send(JSON.stringify(jwt))}).catch(e => {
res.status(401)
res.send(JSON.stringify(e))
})
})
app.post('/action',authenticateJWT,(req, res) => {
res.send(handleAction(req.body,req.user))
// userObj[req.user.data.id].transfer(req.body.tokens,req.body.id).then(tokens => (res.end(tokens))).catch(e => {res.send(JSON.stringify(errorObj)); console.log(e)})
})

@ -12,26 +12,33 @@ var rgb2hex = require('rgb2hex')
gameImage = {
setup: () =>{
console.log("setup",worldObj.id)
fs.mkdir(path.join(__dirname +"/mapImages/tmp/", worldObj.id), (err) => {
if (err) {
return console.error(err);
}
console.log('Directory created successfully!');
});
console.log('Directory created successfully!')
})
},
make:() => {
svg.reset()
creatureArr.forEach((creature,index) => {
tile = creature.location
if (typeof creature.location != "undefined" && typeof creature.colour != "string"){
if (typeof creature.location != "undefined" && creature.location[0] != null && typeof creature.colour != "string"){
colour = creature.colour
svg.circle({
r: 1,
fill: rgb2hex('rgb('+colour[0]+','+colour[1]+','+colour[2]+')').hex,
stroke: rgb2hex('rgb('+colour[0]+','+colour[1]+','+colour[2]+')').hex,
cx: tile[0],
cy: tile[1]
})
cx: creature.location[0],
cy: creature.location[1]
}).text({
x: creature.location[0],
y: creature.location[1],
'font-family': 'helvetica',
'font-size': 0.1,
stroke : '#000',
fill: '#fff'
}, creature.owner[0])
}
})
gameImage.image = svg.render()

@ -0,0 +1,11 @@
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8889 });
wss.on('connection', function connection(ws) {
ws.on('message', function message(data) {
console.log('received: %s', data);
});
ws.send('something');
});
Loading…
Cancel
Save