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