arnaucube
arnaucube/gogame-oldPublic Self-hosted repository
gogame-old/services/gamesrv/gamesrv.go
services/gamesrv/gamesrv.goRaw
 1package gamesrv
 2
 3import (
 4	"fmt"
 5
 6	"github.com/arnaucube/gogame/database"
 7	"github.com/arnaucube/gogame/models"
 8	"github.com/arnaucube/gogame/utils"
 9	"gopkg.in/mgo.v2/bson"
10)
11
12type Service struct {
13	db *database.Db
14}
15
16func New(db *database.Db) *Service {
17	return &Service{
18		db,
19	}
20}
21
22// CreatePlanet is used when a user conquers a planet
23func (srv Service) CreatePlanet(userId bson.ObjectId) (*models.SolarSystem, *models.Planet, error) {
24	size := int64(250)   // TODO get rand inside a range
25	name := "planetname" // TODO get random name
26
27	newPlanet := models.Planet{
28		Size:    size,
29		Name:    name,
30		OwnerId: userId,
31	}
32	err := srv.db.Planets.Insert(newPlanet)
33	if err != nil {
34		return nil, nil, err
35	}
36	var planet *models.Planet
37	err = srv.db.Planets.Find(bson.M{"name": name}).One(&planet)
38	if err != nil {
39		return nil, nil, err
40	}
41
42	// now put the planet in a solar system
43	// get random solar system
44	systemPosition := utils.RandInRange(0, models.GALAXYSIZE)
45	solarSystem, err := srv.PutPlanetInSolarSystem(systemPosition, planet)
46	// 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
47
48	return solarSystem, planet, err
49}
50
51func (srv Service) PutPlanetInSolarSystem(position int64, planet *models.Planet) (*models.SolarSystem, error) {
52	var solarSystem models.SolarSystem
53	err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
54	if err != nil {
55		// solar system non existing yet
56		// create a solarsystem with empty planets
57		var emptyPlanets []bson.ObjectId
58		for i := 0; i < models.SOLARSYSTEMSIZE; i++ {
59			emptyPlanets = append(emptyPlanets, "")
60		}
61		newSolarSystem := models.SolarSystem{
62			Position: position,
63			Planets:  emptyPlanets[:15],
64		}
65		err = srv.db.SolarSystems.Insert(newSolarSystem)
66		if err != nil {
67			return nil, err
68		}
69		err := srv.db.SolarSystems.Find(bson.M{"position": position}).One(&solarSystem)
70
71		return &solarSystem, err
72	}
73	// get free slots in solarSystem
74	posInSolarSystem := utils.RandInRange(0, models.SOLARSYSTEMSIZE)
75	if solarSystem.Planets[posInSolarSystem] != "" {
76		// not empty slot, take another one TODO
77		// if there are no empty slots, return error
78		fmt.Println("not empty slot")
79	}
80	// store planet in solar system
81	solarSystem.Planets[posInSolarSystem] = planet.Id
82	err = srv.db.SolarSystems.Update(bson.M{"position": position}, solarSystem)
83
84	return &solarSystem, err
85
86}