From 8064e1d3b7242f5cac1a25654ffde4d572f6708e Mon Sep 17 00:00:00 2001 From: arnaucube Date: Sun, 16 Jun 2019 15:05:41 +0200 Subject: [PATCH] building process calculation --- models/planet.go | 25 ++++++++++++----- run-local.sh | 13 +++++++++ services/gamesrv/gamesrv.go | 53 ++++++++++++++++++++++++++++++++----- 3 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 run-local.sh diff --git a/models/planet.go b/models/planet.go index 59c2208..ba58fca 100644 --- a/models/planet.go +++ b/models/planet.go @@ -1,13 +1,26 @@ package models -import "gopkg.in/mgo.v2/bson" +import ( + "time" + + "gopkg.in/mgo.v2/bson" +) + +type Process struct { + // if Title == "", is not active, and can build other buildings/research + Title string // building name / research name + level + Building string + Ends time.Time +} type Planet struct { - Id bson.ObjectId `json:"id" bson:"_id,omitempty"` - Size int64 // fields/slots - Name string - OwnerId bson.ObjectId - Buildings map[string]int64 + Id bson.ObjectId `json:"id" bson:"_id,omitempty"` + Size int64 // fields/slots + Name string + OwnerId bson.ObjectId + Buildings map[string]int64 + CurrentBuild Process + Research Process /* Buildings types (in the map, all in lowcase): MetalMine int64 diff --git a/run-local.sh b/run-local.sh new file mode 100644 index 0000000..a644fa5 --- /dev/null +++ b/run-local.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +SESSION="gogame" + +tmux kill-session -t $SESSION || true + +tmux new-session -d -s $SESSION +tmux split-window -d -t 0 -h + +tmux send-keys -t 0 "go run main.go --config config.yaml start" enter +tmux send-keys -t 1 "cd ../gogame-frontend && live-server" enter + +tmux attach -t $SESSION diff --git a/services/gamesrv/gamesrv.go b/services/gamesrv/gamesrv.go index 38846e5..67b581f 100644 --- a/services/gamesrv/gamesrv.go +++ b/services/gamesrv/gamesrv.go @@ -1,7 +1,10 @@ package gamesrv import ( + "errors" "fmt" + "strconv" + "time" "github.com/arnaucube/gogame/constants" "github.com/arnaucube/gogame/database" @@ -42,7 +45,7 @@ func (srv Service) CreatePlanet(userId bson.ObjectId) (*models.SolarSystem, *mod return nil, nil, err } var planet *models.Planet - err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet) + err = srv.db.Planets.Find(bson.M{"ownerid": newPlanet.OwnerId}).One(&planet) if err != nil { return nil, nil, err } @@ -92,13 +95,40 @@ func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) return &solarSystem, err } +// CheckCurrentBuild checks if the planet has a ongoing building in process, and if has finished +// in case that has finished, updates it in db +func (srv Service) CheckCurrentBuild(planet *models.Planet) (bool, error) { + if planet.CurrentBuild.Title != "" { + // the planet is building something, check if has ended + if planet.CurrentBuild.Ends.Unix() < time.Now().Unix() { + // upgrade level of building in planet + planet.Buildings[planet.CurrentBuild.Building] += 1 + + // build end + planet.CurrentBuild.Title = "" + planet.CurrentBuild.Building = "" + + // store in db + err := srv.db.Planets.Update(bson.M{"_id": planet.Id}, planet) + if err != nil { + return true, err + } + return false, nil + } + return true, nil + } + return false, nil + +} + func (srv Service) GetBuildings(user *models.User, planetid bson.ObjectId) (*models.Planet, error) { var planet models.Planet err := srv.db.Planets.Find(bson.M{"_id": planetid, "ownerid": user.Id}).One(&planet) if err != nil { return nil, err } - return &planet, nil + _, err = srv.CheckCurrentBuild(&planet) + return &planet, err } func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, building string) (*models.Planet, error) { @@ -108,22 +138,33 @@ func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, bu if err != nil { return nil, err } + busy, err := srv.CheckCurrentBuild(&planet) + if err != nil { + return nil, err + } + if busy { + return nil, errors.New("busy") + } // get current building level, and get the needed resources for next level resourcesNeeded, err := user.GetBuildingCost(planet, building) if err != nil { return nil, err } + // get time cost of the build + timei64 := models.ConstructionTime(resourcesNeeded, planet.Buildings[building]+1) + endsTime := time.Now().Add(time.Second * time.Duration(timei64)) - fmt.Println("bui", building) - fmt.Println("needed", resourcesNeeded) // if user have enough resources to upgrade the building, upgrade the building err = user.SpendResources(resourcesNeeded) if err != nil { return nil, err } - // upgrade level of building in planet - planet.Buildings[building] += 1 + // add current task to planet + planet.CurrentBuild.Building = building + planet.CurrentBuild.Title = building + " - Level " + strconv.Itoa(int(planet.Buildings[building])) + planet.CurrentBuild.Ends = endsTime + // store planet in db err = srv.db.Planets.Update(bson.M{"_id": planet.Id}, planet) return &planet, nil