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