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/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}