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 planet, err := models.NewPlanet(srv.db, size, name, userId)
29 if err != nil {
30 return nil, nil, err
31 }
32
33 // now put the planet in a solar system
34 // get random solar system
35 systemPosition := utils.RandInRange(0, constants.GALAXYSIZE)
36 solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
37 // 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
38
39 return solarSystem, planet, err
40}
41
42func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
43 var solarSystem models.SolarSystem
44 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
45 if err != nil {
46 // solar system non existing yet
47 // create a solarsystem with empty planets
48 var emptyPlanets []string
49 for i := 0; i < constants.SOLARSYSTEMSIZE; i++ {
50 emptyPlanets = append(emptyPlanets, "empty")
51 }
52 newSolarSystem := models.SolarSystem{
53 Position: position,
54 Planets: emptyPlanets[:15],
55 }
56 err = srv.db.SolarSystems.Insert(newSolarSystem)
57 if err != nil {
58 return nil, err
59 }
60 err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
61
62 return &solarSystem, err
63 }
64 // get free slots in solarSystem
65 posInSolarSystem := utils.RandInRange(0, constants.SOLARSYSTEMSIZE)
66 if solarSystem.Planets[posInSolarSystem] != "" {
67 // not empty slot, take another one TODO
68 // if there are no empty slots, return error
69 fmt.Println("not empty slot")
70 }
71 // store planet in solar system
72 solarSystem.Planets[posInSolarSystem] = planet.Id.String()
73 err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
74
75 return &solarSystem, err
76}
77
78func (srv Service) GetPlanet(user *models.User, planetid bson.ObjectId) (*models.Planet, error) {
79 var planet models.Planet
80 err := srv.db.Planets.Find(bson.M{"_id": planetid, "ownerid": user.Id}).One(&planet)
81 if err != nil {
82 return nil, err
83 }
84 planet.Db = srv.db
85 _, err = planet.CheckCurrentBuild()
86 if err != nil {
87 return nil, err
88 }
89 _, err = planet.GetResources()
90 return &planet, err
91}
92
93func (srv Service) UpgradeBuilding(user *models.User, planetid bson.ObjectId, building string) (*models.Planet, error) {
94 // get planet
95 planet, err := srv.GetPlanet(user, planetid)
96 if err != nil {
97 return nil, err
98 }
99 err = planet.UpgradeBuilding(building)
100 return planet, err
101}