gogame-old/services/gamesrv/gamesrv.go
services/gamesrv/gamesrv.goRaw
1package gamesrv
2
3import (
4 "fmt"
5
6 "github.com/arnaucube/gogame/constants"
7 "github.com/arnaucube/gogame/database"
8 "github.com/arnaucube/gogame/models"
9 "github.com/arnaucube/gogame/utils"
10 "gopkg.in/mgo.v2/bson"
11)
12
13type Service struct {
14 db *database.Db
15}
16
17func New(db *database.Db) *Service {
18 return &Service{
19 db,
20 }
21}
22
23// CreatePlanet is used when a user conquers a planet
24func (srv Service) CreatePlanet(userId bson.ObjectId) (*models.SolarSystem, *models.Planet, error) {
25 size := int64(250) // TODO get rand inside a range
26 name := "planetname" // TODO get random name
27
28 newPlanet := models.Planet{
29 Size: size,
30 Name: name,
31 OwnerId: userId,
32 }
33 // in case that wants to start with resources plants
34 // newPlanet.Buildings = make(map[string]int64)
35 // newPlanet.Buildings["metalplant"] = 1
36 // newPlanet.Buildings["crystalplant"] = 1
37 // newPlanet.Buildings["deuteriumplant"] = 1
38 // newPlanet.Buildings["energyplant"] = 1
39
40 err := srv.db.Planets.Insert(newPlanet)
41 if err != nil {
42 return nil, nil, err
43 }
44 var planet *models.Planet
45 err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet)
46 if err != nil {
47 return nil, nil, err
48 }
49
50 // now put the planet in a solar system
51 // get random solar system
52 systemPosition := utils.RandInRange(0, constants.GALAXYSIZE)
53 solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
54 // TODO if error is returned because there is no empty slots for planets in the solar system in systemPosition, get another systemPosition and try again
55
56 return solarSystem, planet, err
57}
58
59func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
60 var solarSystem models.SolarSystem
61 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
62 if err != nil {
63 // solar system non existing yet
64 // create a solarsystem with empty planets
65 var emptyPlanets []string
66 for i := 0; i < constants.SOLARSYSTEMSIZE; i++ {
67 emptyPlanets = append(emptyPlanets, "empty")
68 }
69 newSolarSystem := models.SolarSystem{
70 Position: position,
71 Planets: emptyPlanets[:15],
72 }
73 err = srv.db.SolarSystems.Insert(newSolarSystem)
74 if err != nil {
75 return nil, err
76 }
77 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
78
79 return &solarSystem, err
80 }
81 // get free slots in solarSystem
82 posInSolarSystem := utils.RandInRange(0, constants.SOLARSYSTEMSIZE)
83 if solarSystem.Planets[posInSolarSystem] != "" {
84 // not empty slot, take another one TODO
85 // if there are no empty slots, return error
86 fmt.Println("not empty slot")
87 }
88 // store planet in solar system
89 solarSystem.Planets[posInSolarSystem] = planet.Id.String()
90 err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
91
92 return &solarSystem, err
93}
94
95func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, building string) (*models.Planet, error) {
96 // get planet
97 var planet models.Planet
98 err := srv.db.Planets.Find(bson.M{"_id": planetid}).One(&planet)
99 if err != nil {
100 return nil, err
101 }
102
103 // get current building level, and get the needed resources for next level
104 resourcesNeeded := constants.BuildingsNeededResources[building][planet.Buildings[building]+1]
105
106 // if user have enough resources to upgrade the building, upgrade the building
107 err = user.SpendResources(resourcesNeeded)
108 if err != nil {
109 return nil, err
110 }
111 // upgrade level of building in planet
112 planet.Buildings[building] += 1
113 // store planet in db
114 err = srv.db.Planets.Update(bson.M{"_id": planet.Id}, planet)
115 return &planet, nil
116}