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["metalmine"] = 1
36 newPlanet.Buildings["crystalmine"] = 1
37 newPlanet.Buildings["deuteriummine"] = 1
38 newPlanet.Buildings["energymine"] = 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) GetBuildings(user *models.User, planetid bson.ObjectId) (*models.Planet, error) {
96 var planet models.Planet
97 err := srv.db.Planets.Find(bson.M{"_id": planetid, "ownerid": user.Id}).One(&planet)
98 if err != nil {
99 return nil, err
100 }
101 return &planet, nil
102}
103
104func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, building string) (*models.Planet, error) {
105 // get planet
106 var planet models.Planet
107 err := srv.db.Planets.Find(bson.M{"_id": planetid}).One(&planet)
108 if err != nil {
109 return nil, err
110 }
111
112 // get current building level, and get the needed resources for next level
113 resourcesNeeded, err := user.GetBuildingCost(planet, building)
114 if err != nil {
115 return nil, err
116 }
117
118 fmt.Println("bui", building)
119 fmt.Println("needed", resourcesNeeded)
120 // if user have enough resources to upgrade the building, upgrade the building
121 err = user.SpendResources(resourcesNeeded)
122 if err != nil {
123 return nil, err
124 }
125 // upgrade level of building in planet
126 planet.Buildings[building] += 1
127 // store planet in db
128 err = srv.db.Planets.Update(bson.M{"_id": planet.Id}, planet)
129 return &planet, nil
130}