From 6226d4779102137a290ed561d221765a6b6617f6 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Wed, 19 Jun 2019 22:32:44 +0200 Subject: [PATCH] add points for buildings --- README.md | 1 + endpoint/handlers.go | 12 ++++++++++-- models/planet.go | 44 +++++++++++++++++++++++++++++++++++++------- models/user.go | 18 ++++++++++++++++++ 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index dafd5c1..a0be8bb 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ The frontend is in https://github.com/arnaucube/gogame-frontend - [x] mongodb connectors - [x] buildings engine - [x] resources engine +- [x] points - [ ] costs calculators - [x] mining growth from mines/buildings - [x] building costs diff --git a/endpoint/handlers.go b/endpoint/handlers.go index a1845ef..0ea6c5d 100644 --- a/endpoint/handlers.go +++ b/endpoint/handlers.go @@ -34,7 +34,11 @@ type RegisterMsg struct { func handleRegister(c *gin.Context) { var registerMsg RegisterMsg - c.BindJSON(®isterMsg) + err := c.BindJSON(®isterMsg) + if err != nil { + fail(c, err, "error on json") + return + } user, err := userservice.Register(registerMsg.Name, registerMsg.Password, registerMsg.Email) if err != nil { fail(c, err, "error on register") @@ -52,7 +56,11 @@ type LoginMsg struct { func handleLogin(c *gin.Context) { var loginMsg LoginMsg - c.BindJSON(&loginMsg) + err := c.BindJSON(&loginMsg) + if err != nil { + fail(c, err, "error on json") + return + } token, user, err := userservice.Login(loginMsg.Email, loginMsg.Password) if err != nil { fail(c, err, "error on login") diff --git a/models/planet.go b/models/planet.go index de51caf..2e8eccc 100644 --- a/models/planet.go +++ b/models/planet.go @@ -2,6 +2,7 @@ package models import ( "errors" + "fmt" "strconv" "time" @@ -50,10 +51,11 @@ type Planet struct { func NewPlanet(db *database.Db, size int64, name string, ownerId bson.ObjectId) (*Planet, error) { newPlanet := Planet{ - Db: db, - Size: size, - Name: name, - OwnerId: ownerId, + Db: db, + LastUpdated: time.Now(), + Size: size, + Name: name, + OwnerId: ownerId, Resources: Resources{ Metal: 500, Crystal: 500, @@ -73,12 +75,14 @@ func NewPlanet(db *database.Db, size int64, name string, ownerId bson.ObjectId) if err != nil { return nil, err } + fmt.Println(newPlanet.Resources) var planet *Planet err = db.Planets.Find(bson.M{"ownerid": newPlanet.OwnerId}).One(&planet) if err != nil { return nil, err } + fmt.Println(planet.Resources) return planet, nil } @@ -132,7 +136,6 @@ func (p *Planet) GetResources() (*Resources, error) { return nil, err } - // return user return &p.Resources, nil } @@ -208,6 +211,21 @@ func (p *Planet) CheckCurrentBuild() (bool, error) { if p.CurrentBuild.Title != "" { // the planet is building something, check if has ended if p.CurrentBuild.Ends.Unix() < time.Now().Unix() { + // add points for resources spend + resourcesNeeded, err := p.GetBuildingCost(p.CurrentBuild.Building) + if err != nil { + return true, err + } + + // add points for resources used (each 1000 units, 1 point + points := ResourcesToPoints(resourcesNeeded) + // 1000 point is the 1 point for the building + points += 1000 + err = AddPoints(p.Db, p.OwnerId, points) + if err != nil { + return true, err + } + // upgrade level of building in planet p.Buildings[p.CurrentBuild.Building] += 1 @@ -216,7 +234,7 @@ func (p *Planet) CheckCurrentBuild() (bool, error) { p.CurrentBuild.Building = "" // store in db - err := p.Db.Planets.Update(bson.M{"_id": p.Id}, p) + err = p.Db.Planets.Update(bson.M{"_id": p.Id}, p) if err != nil { return true, err } @@ -229,6 +247,7 @@ func (p *Planet) CheckCurrentBuild() (bool, error) { return false, nil } + func (p *Planet) UpgradeBuilding(building string) error { busy, err := p.CheckCurrentBuild() if err != nil { @@ -244,7 +263,7 @@ func (p *Planet) UpgradeBuilding(building string) error { return err } // get time cost of the build - timei64 := ConstructionTime(resourcesNeeded, p.Buildings[building]+1) + timei64 := ConstructionTime(resourcesNeeded, p.Buildings["roboticsfactory"]) endsTime := time.Now().Add(time.Second * time.Duration(timei64)) // if user have enough resources to upgrade the building, upgrade the building @@ -252,6 +271,7 @@ func (p *Planet) UpgradeBuilding(building string) error { if err != nil { return err } + // add current task to planet p.CurrentBuild.Building = building p.CurrentBuild.Title = building + " - Level " + strconv.Itoa(int(p.Buildings[building])) @@ -262,3 +282,13 @@ func (p *Planet) UpgradeBuilding(building string) error { err = p.Db.Planets.Update(bson.M{"_id": p.Id}, p) return nil } + +func ResourcesToPoints(r Resources) int64 { + p := int64(0) + p = p + r.Metal + p = p + r.Crystal + p = p + r.Deuterium + p = p + r.Energy + fmt.Println("p", p) + return p +} diff --git a/models/user.go b/models/user.go index c39fd68..ebffad5 100644 --- a/models/user.go +++ b/models/user.go @@ -15,6 +15,7 @@ type UserDb struct { Email string LastUpdated time.Time Planets []bson.ObjectId + Points int64 // real points are this value / 1000 } // User is the data in memory, after getting it from DB @@ -24,6 +25,7 @@ type User struct { Name string LastUpdated time.Time Planets []bson.ObjectId + Points int64 } func NewUser(db *database.Db, name, password, email string) (*User, error) { @@ -33,6 +35,7 @@ func NewUser(db *database.Db, name, password, email string) (*User, error) { Password: password, Email: email, LastUpdated: time.Now(), + Points: 0, } err := db.Users.Insert(newUser) if err != nil { @@ -49,6 +52,7 @@ func UserDbToUser(db *database.Db, u UserDb) *User { LastUpdated: u.LastUpdated, db: db, Planets: u.Planets, + Points: u.Points, } } @@ -79,3 +83,17 @@ func (u *User) GetPlanets() ([]Planet, error) { } return planets, nil } + +func AddPoints(db *database.Db, userId bson.ObjectId, points int64) error { + var userDb UserDb + err := db.Users.Find(bson.M{"_id": userId}).One(&userDb) + if err != nil { + return err + } + newPoints := userDb.Points + points + + err = db.Users.Update(bson.M{"_id": userId}, bson.M{"$set": bson.M{ + "points": newPoints, + }}) + return err +}