func (g *Game) internalCreatureTeleport(_creature pul.ICreature, _from pul.ITile, _to pul.ITile) (ret int) { ret = RET_NOERROR if _from == nil || _to == nil { ret = RET_NOTPOSSIBLE } else { // Move creature object to destination tile if ret = _from.RemoveCreature(_creature, true); ret == RET_NOTPOSSIBLE { return } if ret = _to.AddCreature(_creature, false); ret == RET_NOTPOSSIBLE { _from.AddCreature(_creature, false) // Something went wrong, put creature back on old tile return } _creature.SetTile(_to) // Tell creatures this creature has been teleported g.mutexCreatureList.RLock() defer g.mutexCreatureList.RUnlock() for _, value := range g.Creatures { if value != nil { value.OnCreatureMove(_creature, _from, _to, true) } } } // No error, played succesfully teleported if ret == RET_NOERROR { ret = RET_PLAYERISTELEPORTED } return }
func (g *Game) OnCreatureMove(_creature pul.ICreature, _direction int) (ret int) { ret = RET_NOTPOSSIBLE if !CreatureCanMove(_creature) { return } currentTile := _creature.GetTile() destinationPosition := currentTile.GetPosition() switch _direction { case DIR_NORTH: destinationPosition.Y -= 1 case DIR_SOUTH: destinationPosition.Y += 1 case DIR_WEST: destinationPosition.X -= 1 case DIR_EAST: destinationPosition.X += 1 } // Check if destination tile exists destinationTile, ok := g_map.GetTileFromPosition(destinationPosition) if !ok { return } // Check if we can move to the destination tile if ret = destinationTile.CheckMovement(_creature, _direction); ret == RET_NOTPOSSIBLE { return } // Update position _creature.SetTile(destinationTile) // fmt.Printf("[%v] From (%v,%v) To (%v,%v)\n", _creature.GetName(), currentTile.Position.X, currentTile.Position.Y, destinationPosition.X, destinationPosition.Y) // Tell creatures this creature has moved g.mutexCreatureList.RLock() defer g.mutexCreatureList.RUnlock() for _, value := range g.Creatures { if value != nil { value.OnCreatureMove(_creature, currentTile, destinationTile, false) } } // Move creature object to destination tile if ret = currentTile.RemoveCreature(_creature, true); ret == RET_NOTPOSSIBLE { return } if ret = destinationTile.AddCreature(_creature, true); ret == RET_NOTPOSSIBLE { currentTile.AddCreature(_creature, false) // Something went wrong, put creature back on old tile _creature.SetTile(currentTile) return } // If ICreature is a player type we can check for wild encounter g.checkForWildEncounter(_creature) return }