← Back to team overview

widelands-dev team mailing list archive

Re: [Merge] lp:~widelands-dev/widelands/bug-1380287 into lp:widelands

 

Review: Needs Fixing

I found a couple more nits. Otherwise LGTM, please merge after fixing them.

Diff comments:

> === modified file 'src/ai/ai_help_structs.h'
> --- src/ai/ai_help_structs.h	2015-03-26 06:59:37 +0000
> +++ src/ai/ai_help_structs.h	2015-04-07 13:33:49 +0000
> @@ -438,7 +438,7 @@
>  
>  	// a ship circumvents all islands in the same direction, the value
>  	// is assigned only once
> -	Widelands::ScoutingDirection island_circ_direction = Widelands::ScoutingDirection::kClockwise;
> +	Widelands::IslandExploreDirection island_circ_direction = Widelands::IslandExploreDirection::kClockwise;
>  	bool waiting_for_command_ = false;
>  	int32_t last_command_time = 0;
>  };
> 
> === modified file 'src/ai/defaultai.cc'
> --- src/ai/defaultai.cc	2015-03-26 20:35:19 +0000
> +++ src/ai/defaultai.cc	2015-04-07 13:33:49 +0000
> @@ -3795,9 +3795,9 @@
>  	allships.push_back(ShipObserver());
>  	allships.back().ship = &ship;
>  	if (game().get_gametime() % 2 == 0) {
> -		allships.back().island_circ_direction = ScoutingDirection::kClockwise;
> +		allships.back().island_circ_direction = IslandExploreDirection::kClockwise;
>  	} else {
> -		allships.back().island_circ_direction = ScoutingDirection::kCounterClockwise;
> +		allships.back().island_circ_direction = IslandExploreDirection::kCounterClockwise;
>  	}
>  }
>  
> @@ -4058,10 +4058,10 @@
>  			so.waiting_for_command_ = false;
>  			;
>  		} else {
> -			// 2.B Yes, pick one of avaiable directions
> +			// 2.B Yes, pick one of avaliable directions
>  			const Direction final_direction =
>  			   possible_directions.at(gametime % possible_directions.size());
> -			game().send_player_ship_scout_direction(*so.ship, final_direction);
> +			game().send_player_ship_scouting_direction(*so.ship, static_cast<WalkingDir>(final_direction));
>  			so.last_command_time = gametime;
>  			so.waiting_for_command_ = false;
>  		}
> 
> === modified file 'src/economy/portdock.cc'
> --- src/economy/portdock.cc	2015-02-16 20:23:15 +0000
> +++ src/economy/portdock.cc	2015-04-07 13:33:49 +0000
> @@ -213,12 +213,11 @@
>  
>  	PlayerImmovable::cleanup(egbase);
>  
> -	//now let attempt to recreate the portdock
> +	// Now let's attempt to recreate the portdock.
>  	if (wh) {
>  		if (!wh->m_cleanup_in_progress){
>  			if (upcast(Game, game, &egbase)) {
>  				if (game->is_loaded()) { //do not attempt when shutting down
> -					Player& player = owner();
>  					wh->restore_portdock_or_destroy(egbase);
>  				}
>  			}
> 
> === modified file 'src/logic/game.cc'
> --- src/logic/game.cc	2015-02-08 19:08:36 +0000
> +++ src/logic/game.cc	2015-04-07 13:33:49 +0000
> @@ -874,7 +874,7 @@
>  }
>  
>  
> -void Game::send_player_ship_scout_direction(Ship & ship, uint8_t direction)
> +void Game::send_player_ship_scouting_direction(Ship & ship, WalkingDir direction)
>  {
>  	send_player_command
>  		(*new CmdShipScoutDirection
> @@ -888,7 +888,7 @@
>  			(get_gametime(), ship.get_owner()->player_number(), ship.serial(), coords));
>  }
>  
> -void Game::send_player_ship_explore_island(Ship & ship, ScoutingDirection direction)
> +void Game::send_player_ship_explore_island(Ship & ship, IslandExploreDirection direction)
>  {
>  	send_player_command
>  		(*new CmdShipExploreIsland
> 
> === modified file 'src/logic/game.h'
> --- src/logic/game.h	2015-02-08 19:08:36 +0000
> +++ src/logic/game.h	2015-04-07 13:33:49 +0000
> @@ -41,6 +41,7 @@
>  struct Flag;
>  struct Path;
>  struct PlayerImmovable;
> +enum class IslandExploreDirection;
>  enum class ScoutingDirection;
>  struct Ship;
>  struct PlayerEndStatus;
> @@ -181,9 +182,9 @@
>  	void send_player_enemyflagaction
>  		(const Flag &, PlayerNumber, uint32_t count);
>  
> -	void send_player_ship_scout_direction(Ship &, uint8_t);
> +	void send_player_ship_scouting_direction(Ship &, WalkingDir);
>  	void send_player_ship_construct_port(Ship &, Coords);
> -	void send_player_ship_explore_island(Ship &, ScoutingDirection);
> +	void send_player_ship_explore_island(Ship &, IslandExploreDirection);
>  	void send_player_sink_ship(Ship &);
>  	void send_player_cancel_expedition_ship(Ship &);
>  
> 
> === modified file 'src/logic/playercommand.cc'
> --- src/logic/playercommand.cc	2015-02-19 19:37:09 +0000
> +++ src/logic/playercommand.cc	2015-04-07 13:33:49 +0000
> @@ -777,7 +777,7 @@
>  	PlayerCommand (0, des.unsigned_8())
>  {
>  	serial = des.unsigned_32();
> -	dir    = des.unsigned_8();
> +	dir    = static_cast<WalkingDir>(des.unsigned_8());
>  }
>  
>  void CmdShipScoutDirection::execute (Game & game)
> @@ -796,7 +796,7 @@
>  				(ship->state_is_expedition())?"Y":"N");
>  			return;
>  		}
> -		ship->exp_scout_direction(game, dir);
> +		ship->exp_scouting_direction(game, dir);
>  	}
>  }
>  
> @@ -805,7 +805,7 @@
>  	ser.unsigned_8 (PLCMD_SHIP_SCOUT);
>  	ser.unsigned_8 (sender());
>  	ser.unsigned_32(serial);
> -	ser.unsigned_8 (dir);
> +	ser.unsigned_8 (static_cast<uint8_t>(dir));
>  }
>  
>  #define PLAYER_CMD_SHIP_SCOUT_DIRECTION_VERSION 1
> @@ -818,7 +818,7 @@
>  			PlayerCommand::read(fr, egbase, mol);
>  			serial = get_object_serial_or_zero<Ship>(fr.unsigned_32(), mol);
>  			// direction
> -			dir = fr.unsigned_8();
> +			dir = static_cast<WalkingDir>(fr.unsigned_8());
>  		} else
>  			throw GameDataError("unknown/unhandled version %u", packet_version);
>  	} catch (const WException & e) {
> @@ -837,7 +837,7 @@
>  	fw.unsigned_32(mos.get_object_file_index_or_zero(egbase.objects().get_object(serial)));
>  
>  	// direction
> -	fw.unsigned_8(dir);
> +	fw.unsigned_8(static_cast<uint8_t>(dir));
>  }
>  
>  
> @@ -912,7 +912,7 @@
>  	PlayerCommand (0, des.unsigned_8())
>  {
>  	serial = des.unsigned_32();
> -	scouting_direction = static_cast<ScoutingDirection>(des.unsigned_8());
> +	island_explore_direction = static_cast<IslandExploreDirection>(des.unsigned_8());
>  }
>  
>  void CmdShipExploreIsland::execute (Game & game)
> @@ -931,7 +931,7 @@
>  				(ship->state_is_expedition())?"Y":"N");
>  			return;
>  		}
> -		ship->exp_explore_island(game, scouting_direction);
> +		ship->exp_explore_island(game, island_explore_direction);
>  	}
>  }
>  
> @@ -940,7 +940,7 @@
>  	ser.unsigned_8 (PLCMD_SHIP_EXPLORE);
>  	ser.unsigned_8 (sender());
>  	ser.unsigned_32(serial);
> -	ser.unsigned_8 (static_cast<uint8_t>(scouting_direction));
> +	ser.unsigned_8 (static_cast<uint8_t>(island_explore_direction));
>  }
>  
>  #define PLAYER_CMD_SHIP_EXPLORE_ISLAND_VERSION 1
> @@ -952,7 +952,7 @@
>  		if (packet_version == PLAYER_CMD_SHIP_EXPLORE_ISLAND_VERSION) {
>  			PlayerCommand::read(fr, egbase, mol);
>  			serial = get_object_serial_or_zero<Ship>(fr.unsigned_32(), mol);
> -			scouting_direction = static_cast<ScoutingDirection>(fr.unsigned_8());
> +			island_explore_direction = static_cast<IslandExploreDirection>(fr.unsigned_8());
>  		} else
>  			throw GameDataError("unknown/unhandled version %u", packet_version);
>  	} catch (const WException & e) {
> @@ -971,7 +971,7 @@
>  	fw.unsigned_32(mos.get_object_file_index_or_zero(egbase.objects().get_object(serial)));
>  
>  	// Direction of exploration
> -	fw.unsigned_8(static_cast<uint8_t>(scouting_direction));
> +	fw.unsigned_8(static_cast<uint8_t>(island_explore_direction));
>  }
>  
>  
> 
> === modified file 'src/logic/playercommand.h'
> --- src/logic/playercommand.h	2015-02-05 12:11:20 +0000
> +++ src/logic/playercommand.h	2015-04-07 13:33:49 +0000
> @@ -313,7 +313,7 @@
>  struct CmdShipScoutDirection : public PlayerCommand {
>  	CmdShipScoutDirection() : PlayerCommand(), serial(0) {} // For savegame loading
>  	CmdShipScoutDirection
> -		(int32_t const t, PlayerNumber const p, Serial s, uint8_t direction)
> +		(int32_t const t, PlayerNumber const p, Serial s, WalkingDir direction)
>  		: PlayerCommand(t, p), serial(s), dir(direction)
>  	{}
>  
> @@ -329,7 +329,7 @@
>  
>  private:
>  	Serial serial;
> -	uint8_t dir;
> +	WalkingDir dir;
>  };
>  
>  struct CmdShipConstructPort : public PlayerCommand {
> @@ -357,8 +357,8 @@
>  struct CmdShipExploreIsland : public PlayerCommand {
>  	CmdShipExploreIsland() : PlayerCommand(), serial(0) {} // For savegame loading
>  	CmdShipExploreIsland
> -		(int32_t const t, PlayerNumber const p, Serial s, ScoutingDirection direction)
> -		: PlayerCommand(t, p), serial(s), scouting_direction(direction)
> +		(int32_t const t, PlayerNumber const p, Serial s, IslandExploreDirection direction)
> +		: PlayerCommand(t, p), serial(s), island_explore_direction(direction)
>  	{}
>  
>  	void write(FileWrite &, EditorGameBase &, MapObjectSaver  &) override;
> @@ -373,7 +373,7 @@
>  
>  private:
>  	Serial serial;
> -	ScoutingDirection scouting_direction;
> +	IslandExploreDirection island_explore_direction;
>  };
>  
>  struct CmdShipSink : public PlayerCommand {
> 
> === modified file 'src/logic/ship.cc'
> --- src/logic/ship.cc	2015-02-05 12:11:20 +0000
> +++ src/logic/ship.cc	2015-04-07 13:33:49 +0000
> @@ -550,15 +550,15 @@
>  	case EXP_SCOUTING: {
>  		if (m_expedition->island_exploration) {  // Exploration of the island
>  			if (exp_close_to_coast()) {
> -				if (m_expedition->direction == 0) {
> +				if (m_expedition->scouting_direction == WalkingDir::IDLE) {
>  					// Make sure we know the location of the coast and use it as initial direction we
>  					// come from
> -					m_expedition->direction = WALK_SE;
> -					for (uint8_t secure = 0; exp_dir_swimable(m_expedition->direction); ++secure) {
> +					m_expedition->scouting_direction = WALK_SE;
> +					for (uint8_t secure = 0; exp_dir_swimable(m_expedition->scouting_direction); ++secure) {
>  						assert(secure < 6);
> -						m_expedition->direction = get_cw_neighbour(m_expedition->direction);
> +						m_expedition->scouting_direction = get_cw_neighbour(m_expedition->scouting_direction);
>  					}
> -					m_expedition->direction = get_backward_dir(m_expedition->direction);
> +					m_expedition->scouting_direction = get_backward_dir(m_expedition->scouting_direction);
>  					// Save the position - this is where we start
>  					m_expedition->exploration_start = get_position();
>  				} else {
> @@ -579,18 +579,18 @@
>  				// The ship is supposed to follow the coast as close as possible, therefore the check
>  				// for
>  				// a swimable field begins at the neighbour field of the direction we came from.
> -				m_expedition->direction = get_backward_dir(m_expedition->direction);
> -				if (m_expedition->scouting_direction == ScoutingDirection::kClockwise) {
> +				m_expedition->scouting_direction = get_backward_dir(m_expedition->scouting_direction);
> +				if (m_expedition->island_explore_direction == IslandExploreDirection::kClockwise) {
>  					do {
> -						m_expedition->direction = get_ccw_neighbour(m_expedition->direction);
> -					} while (!exp_dir_swimable(m_expedition->direction));
> +						m_expedition->scouting_direction = get_ccw_neighbour(m_expedition->scouting_direction);
> +					} while (!exp_dir_swimable(m_expedition->scouting_direction));
>  				} else {
>  					do {
> -						m_expedition->direction = get_cw_neighbour(m_expedition->direction);
> -					} while (!exp_dir_swimable(m_expedition->direction));
> +						m_expedition->scouting_direction = get_cw_neighbour(m_expedition->scouting_direction);
> +					} while (!exp_dir_swimable(m_expedition->scouting_direction));
>  				}
>  				state.ivar1 = 1;
> -				return start_task_move(game, m_expedition->direction, descr().get_sail_anims(), false);
> +				return start_task_move(game, m_expedition->scouting_direction, descr().get_sail_anims(), false);
>  			} else {
>  				// The ship got the command to scout around an island, but is not close to any island
>  				// Most likely the command was send as the ship was on an exploration and just leaving
> @@ -615,10 +615,10 @@
>  				return start_task_idle(game, descr().main_animation(), 1500);
>  			}
>  		} else {  // scouting towards a specific direction
> -			if (exp_dir_swimable(m_expedition->direction)) {
> +			if (exp_dir_swimable(m_expedition->scouting_direction)) {
>  				// the scouting direction is still free to move
>  				state.ivar1 = 1;
> -				start_task_move(game, m_expedition->direction, descr().get_sail_anims(), false);
> +				start_task_move(game, m_expedition->scouting_direction, descr().get_sail_anims(), false);
>  				return;
>  			}
>  			// coast reached
> @@ -791,9 +791,9 @@
>  	m_expedition.reset(new Expedition());
>  	m_expedition->seen_port_buildspaces.reset(new std::list<Coords>());
>  	m_expedition->island_exploration = false;
> -	m_expedition->direction = 0;
> +	m_expedition->scouting_direction = WalkingDir::IDLE;
>  	m_expedition->exploration_start = Coords(0, 0);
> -	m_expedition->scouting_direction = ScoutingDirection::kClockwise;
> +	m_expedition->island_explore_direction = IslandExploreDirection::kClockwise;
>  	m_expedition->economy.reset(new Economy(*get_owner()));
>  
>  	// We are no longer in any other economy, but instead are an economy of our
> @@ -824,13 +824,22 @@
>  
>  /// Initializes / changes the direction of scouting to @arg direction
>  /// @note only called via player command
> -void Ship::exp_scout_direction(Game&, uint8_t direction) {
> +void Ship::exp_scouting_direction(Game&, WalkingDir scouting_direction) {
>  	assert(m_expedition);
>  	m_ship_state = EXP_SCOUTING;
> -	m_expedition->direction = direction;
> +	m_expedition->scouting_direction = scouting_direction;
>  	m_expedition->island_exploration = false;
>  }
>  
> +//Returns integer of direction, or WalkingDir::IDLE if query invalid

documentation should go into the header. also below

> +//Intended for LUA scripting
> +WalkingDir Ship::get_scouting_direction() {
> +	if (m_expedition && m_ship_state == EXP_SCOUTING && !m_expedition->island_exploration) {
> +		return m_expedition->scouting_direction;
> +	}
> +	return WalkingDir::IDLE;
> +}
> +
>  /// Initializes the construction of a port at @arg c
>  /// @note only called via player command
>  void Ship::exp_construct_port(Game&, const Coords& c) {
> @@ -840,16 +849,26 @@
>  	m_ship_state = EXP_COLONIZING;
>  }
>  
> -/// Initializes / changes the direction the island exploration in @arg scouting_direction direction
> +/// Initializes / changes the direction the island exploration in @arg island_explore_direction direction
>  /// @note only called via player command
> -void Ship::exp_explore_island(Game&, ScoutingDirection scouting_direction) {
> +void Ship::exp_explore_island(Game&, IslandExploreDirection island_explore_direction) {
>  	assert(m_expedition);
>  	m_ship_state = EXP_SCOUTING;
> -	m_expedition->scouting_direction = scouting_direction;
> -	m_expedition->direction = 0;
> +	m_expedition->island_explore_direction = island_explore_direction;
> +	m_expedition->scouting_direction = WalkingDir::IDLE;
>  	m_expedition->island_exploration = true;
>  }
>  
> +//Returns integer of direction, or 255 if query invalid
> +//Intended for LUA scripting
> +IslandExploreDirection Ship::get_island_explore_direction() {
> +	if (m_expedition && m_ship_state == EXP_SCOUTING && m_expedition->island_exploration) {
> +		return m_expedition->island_explore_direction;
> +	}
> +	return IslandExploreDirection::kNotSet;
> +}
> +
> +
>  /// Cancels a currently running expedition
>  /// @note only called via player command
>  void Ship::exp_cancel(Game& game) {
> @@ -995,11 +1014,11 @@
>  				// whether scouting or exploring
>  				m_expedition->island_exploration = fr.unsigned_8() == 1;
>  				// current direction
> -				m_expedition->direction = fr.unsigned_8();
> +				m_expedition->scouting_direction = static_cast<WalkingDir>(fr.unsigned_8());
>  				// Start coordinates of an island exploration
>  				m_expedition->exploration_start = read_coords_32(&fr);
>  				// Whether the exploration is done clockwise or counter clockwise
> -				m_expedition->scouting_direction = static_cast<ScoutingDirection>(fr.unsigned_8());
> +				m_expedition->island_explore_direction = static_cast<IslandExploreDirection>(fr.unsigned_8());
>  			}
>  		} else
>  			m_ship_state = TRANSPORT;
> @@ -1114,11 +1133,11 @@
>  		// whether scouting or exploring
>  		fw.unsigned_8(m_expedition->island_exploration ? 1 : 0);
>  		// current direction
> -		fw.unsigned_8(m_expedition->direction);
> +		fw.unsigned_8(static_cast<uint8_t>(m_expedition->scouting_direction));
>  		// Start coordinates of an island exploration
>  		write_coords_32(&fw, m_expedition->exploration_start);
>  		// Whether the exploration is done clockwise or counter clockwise
> -		fw.unsigned_8(static_cast<uint8_t>(m_expedition->scouting_direction));
> +		fw.unsigned_8(static_cast<uint8_t>(m_expedition->island_explore_direction));
>  	}
>  
>  	fw.unsigned_32(mos.get_object_file_index_or_zero(m_lastdock.get(egbase)));
> 
> === modified file 'src/logic/ship.h'
> --- src/logic/ship.h	2015-02-05 12:11:20 +0000
> +++ src/logic/ship.h	2015-04-07 13:33:49 +0000
> @@ -38,9 +38,10 @@
>  class PortDock;
>  
>  // This can't be part of the Ship class because of forward declaration in game.h
> -enum class ScoutingDirection {
> +enum class IslandExploreDirection {
>  	kCounterClockwise = 0, // This comes first for savegame compatibility (used to be = 0)
> -	kClockwise = 1
> +	kClockwise = 1,
> +	kNotSet
>  };
>  
>  struct NoteShipMessage {
> @@ -202,9 +203,11 @@
>  		return m_expedition->seen_port_buildspaces.get();
>  	}
>  
> -	void exp_scout_direction(Game &, uint8_t);
> +	void exp_scouting_direction(Game &, WalkingDir);
>  	void exp_construct_port (Game &, const Coords&);
> -	void exp_explore_island (Game &, ScoutingDirection);
> +	void exp_explore_island (Game &, IslandExploreDirection);
> +	WalkingDir get_scouting_direction();
> +	IslandExploreDirection get_island_explore_direction();
>  
>  	void exp_cancel (Game &);
>  	void sink_ship  (Game &);
> @@ -242,9 +245,9 @@
>  		std::unique_ptr<std::list<Coords> > seen_port_buildspaces;
>  		bool swimable[LAST_DIRECTION];
>  		bool island_exploration;
> -		uint8_t direction;
> +		WalkingDir scouting_direction;
>  		Coords exploration_start;
> -		ScoutingDirection scouting_direction;
> +		IslandExploreDirection island_explore_direction;
>  		std::unique_ptr<Economy> economy;
>  	};
>  	std::unique_ptr<Expedition> m_expedition;
> 
> === modified file 'src/logic/walkingdir.cc'
> --- src/logic/walkingdir.cc	2014-07-14 10:45:44 +0000
> +++ src/logic/walkingdir.cc	2015-04-07 13:33:49 +0000
> @@ -22,61 +22,61 @@
>  namespace Widelands {
>  
>  /// \returns the neighbour direction in clockwise
> -uint8_t get_cw_neighbour(uint8_t dir) {
> +WalkingDir get_cw_neighbour(WalkingDir dir) {
>  	switch (dir) {
> -		case WALK_NE:
> -			return WALK_E;
> -		case WALK_E:
> -			return WALK_SE;
> -		case WALK_SE:
> -			return WALK_SW;
> -		case WALK_SW:
> -			return WALK_W;
> -		case WALK_W:
> -			return WALK_NW;
> -		case WALK_NW:
> -			return WALK_NE;
> +		case WalkingDir::WALK_NE:
> +			return WalkingDir::WALK_E;
> +		case WalkingDir::WALK_E:
> +			return WalkingDir::WALK_SE;
> +		case WalkingDir::WALK_SE:
> +			return WalkingDir::WALK_SW;
> +		case WalkingDir::WALK_SW:
> +			return WalkingDir::WALK_W;
> +		case WalkingDir::WALK_W:
> +			return WalkingDir::WALK_NW;
> +		case WalkingDir::WALK_NW:
> +			return WalkingDir::WALK_NE;
>  		default:
> -			return 0;
> +			return WalkingDir::IDLE;
>  	}
>  }
>  
>  /// \returns the neighbour direction in counterclockwise
> -uint8_t get_ccw_neighbour(uint8_t dir) {
> +WalkingDir get_ccw_neighbour(WalkingDir dir) {
>  	switch (dir) {
> -		case WALK_E:
> -			return WALK_NE;
> -		case WALK_NE:
> -			return WALK_NW;
> -		case WALK_NW:
> -			return WALK_W;
> -		case WALK_W:
> -			return WALK_SW;
> -		case WALK_SW:
> -			return WALK_SE;
> -		case WALK_SE:
> -			return WALK_E;
> +		case WalkingDir::WALK_E:
> +			return WalkingDir::WALK_NE;
> +		case WalkingDir::WALK_NE:
> +			return WalkingDir::WALK_NW;
> +		case WalkingDir::WALK_NW:
> +			return WalkingDir::WALK_W;
> +		case WalkingDir::WALK_W:
> +			return WalkingDir::WALK_SW;
> +		case WalkingDir::WALK_SW:
> +			return WalkingDir::WALK_SE;
> +		case WalkingDir::WALK_SE:
> +			return WalkingDir::WALK_E;
>  		default:
> -			return 0;
> +			return WalkingDir::IDLE;
>  	}
>  }
>  
> -uint8_t get_backward_dir(uint8_t dir) {
> +WalkingDir get_backward_dir(WalkingDir dir) {
>  	switch (dir) {
> -		case WALK_E:
> -			return WALK_W;
> -		case WALK_NE:
> -			return WALK_SW;
> -		case WALK_NW:
> -			return WALK_SE;
> -		case WALK_W:
> -			return WALK_E;
> -		case WALK_SW:
> -			return WALK_NE;
> -		case WALK_SE:
> -			return WALK_NW;
> +		case WalkingDir::WALK_E:
> +			return WalkingDir::WALK_W;
> +		case WalkingDir::WALK_NE:
> +			return WalkingDir::WALK_SW;
> +		case WalkingDir::WALK_NW:
> +			return WalkingDir::WALK_SE;
> +		case WalkingDir::WALK_W:
> +			return WalkingDir::WALK_E;
> +		case WalkingDir::WALK_SW:
> +			return WalkingDir::WALK_NE;
> +		case WalkingDir::WALK_SE:
> +			return WalkingDir::WALK_NW;
>  		default:
> -			return 0;
> +			return WalkingDir::IDLE;
>  	}
>  }
>  
> 
> === modified file 'src/logic/walkingdir.h'
> --- src/logic/walkingdir.h	2014-07-05 16:41:51 +0000
> +++ src/logic/walkingdir.h	2015-04-07 13:33:49 +0000
> @@ -37,9 +37,9 @@
>  	LAST_DIRECTION  = 6,
>  };
>  
> -uint8_t get_cw_neighbour(uint8_t dir);
> -uint8_t get_ccw_neighbour(uint8_t dir);
> -uint8_t get_backward_dir(uint8_t dir);
> +WalkingDir get_cw_neighbour(WalkingDir dir);
> +WalkingDir get_ccw_neighbour(WalkingDir dir);
> +WalkingDir get_backward_dir(WalkingDir dir);
>  
>  }
>  
> 
> === modified file 'src/scripting/lua_game.cc'
> --- src/scripting/lua_game.cc	2015-01-31 16:03:59 +0000
> +++ src/scripting/lua_game.cc	2015-04-07 13:33:49 +0000
> @@ -97,6 +97,7 @@
>  	METHOD(LuaPlayer, hide_fields),
>  	METHOD(LuaPlayer, reveal_scenario),
>  	METHOD(LuaPlayer, reveal_campaign),
> +	METHOD(LuaPlayer, get_ships),
>  	METHOD(LuaPlayer, get_buildings),
>  	METHOD(LuaPlayer, get_suitability),
>  	METHOD(LuaPlayer, allow_workers),
> @@ -628,6 +629,7 @@
>  int LuaPlayer::reveal_campaign(lua_State * L) {
>  	if (get_game(L).get_ipl()->player_number() != player_number())
>  		report_error(L, "Can only be called for interactive player!");
> +		report_error(L, "Can only be called for interactive player!");
>  
>  	CampaignVisibilitySave cvs;
>  	cvs.set_campaign_visibility(luaL_checkstring(L, 2), true);
> @@ -635,6 +637,41 @@
>  	return 0;
>  }
>  
> +/* RST
> +	.. method:: get_ships()
> +
> +		:returns: array of player's ships
> +		:rtype: :class:`array` or :class:`table`
> +*/
> +int LuaPlayer::get_ships(lua_State * L) {
> +	EditorGameBase & egbase = get_egbase(L);
> +	Map * map = egbase.get_map();
> +	PlayerNumber p = (get(L, egbase)).player_number();
> +	lua_newtable(L);
> +	uint32_t cidx = 1;
> +
> +	std::set<OPtr<Ship>> found_ships;
> +	for (int16_t y = 0; y < map->get_height(); ++y) {
> +		for (int16_t x = 0; x < map->get_width(); ++x) {
> +			FCoords f = map->get_fcoords(Coords(x, y));
> +			// there are too many bobs on the map so we investigate
> +			// only bobs on water
> +			if (f.field->nodecaps() & MOVECAPS_SWIM) {
> +				for (Bob* bob = f.field->get_first_bob(); bob; bob = bob->get_next_on_field()) {
> +					if (upcast(Ship, ship, bob)) {
> +						if (ship->get_owner()->player_number() == p && !found_ships.count(ship)) {
> +							found_ships.insert(ship);
> +							lua_pushuint32(L, cidx++);
> +							LuaMaps::upcasted_map_object_to_lua(L, ship);
> +							lua_rawset(L, -3);
> +						}
> +					}
> +				}
> +			}
> +		}
> +	}
> +	return 1;
> +}
>  
>  /* RST
>  	.. method:: get_buildings(which)
> 
> === modified file 'src/scripting/lua_game.h'
> --- src/scripting/lua_game.h	2015-02-09 05:57:08 +0000
> +++ src/scripting/lua_game.h	2015-04-07 13:33:49 +0000
> @@ -83,6 +83,7 @@
>  	int hide_fields(lua_State * L);
>  	int reveal_scenario(lua_State * L);
>  	int reveal_campaign(lua_State * L);
> +	int get_ships(lua_State * L);
>  	int get_buildings(lua_State * L);
>  	int get_suitability(lua_State * L);
>  	int allow_workers(lua_State * L);
> 
> === modified file 'src/scripting/lua_map.cc'
> --- src/scripting/lua_map.cc	2015-02-12 21:03:20 +0000
> +++ src/scripting/lua_map.cc	2015-04-07 13:33:49 +0000
> @@ -32,6 +32,7 @@
>  #include "logic/maphollowregion.h"
>  #include "logic/mapregion.h"
>  #include "logic/player.h"
> +#include "logic/ship.h"
>  #include "logic/soldier.h"
>  #include "logic/warelist.h"
>  #include "logic/widelands_geometry.h"
> @@ -44,6 +45,10 @@
>  #include "scripting/lua_game.h"
>  #include "wui/mapviewpixelfunctions.h"
>  
> +
> +//#include "scripting/luna_impl.h" //

commented out headers?

> +//#include "economy/portdock.h"
> +
>  using namespace Widelands;
>  
>  namespace LuaMaps {
> @@ -2681,13 +2686,13 @@
>   ==========================================================
>   */
>  
> +
>  /*
>   ==========================================================
>   C METHODS
>   ==========================================================
>   */
>  
> -
>  /* RST
>  Building
>  --------
> @@ -2806,10 +2811,13 @@
>  	METHOD(LuaWarehouse, get_workers),
>  	METHOD(LuaWarehouse, set_soldiers),
>  	METHOD(LuaWarehouse, get_soldiers),
> +	METHOD(LuaWarehouse, start_expedition),
> +	METHOD(LuaWarehouse, cancel_expedition),
>  	{nullptr, nullptr},
>  };
>  const PropertyType<LuaWarehouse> LuaWarehouse::Properties[] = {
>  	PROP_RO(LuaWarehouse, portdock),
> +	PROP_RO(LuaWarehouse, expedition_in_progress),
>  	{nullptr, nullptr, nullptr},
>  };
>  
> @@ -2829,6 +2837,26 @@
>  	return upcasted_map_object_to_lua(L, get(L, get_egbase(L))->get_portdock());
>  }
>  
> +/* RST
> +	.. attribute:: expedition_in_progress
> +
> +		(RO) If this Warehouse is a port, and an expedition is in
> +		progress, returns true, otherwise nil
> +*/
> +int LuaWarehouse::get_expedition_in_progress(lua_State * L) {
> +
> +	Warehouse* Wh = get(L, get_egbase(L));

variable names are lower_case in Widelands.

> +
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		PortDock* pd = Wh->get_portdock();
> +		if (pd) {
> +			if (pd->expedition_started()){
> +				return 1;
> +			}
> +		}
> +	}
> +	return 0;
> +}
>  
>  /*
>   ==========================================================
> @@ -2895,13 +2923,72 @@
>  	return do_set_soldiers(L, wh->get_position(), wh, wh->get_owner());
>  }
>  
> +/* RST
> +	.. method:: start_expedition(port)
> +
> +		:arg port
> +
> +		Starts preparation for expedition
> +
> +*/
> +int LuaWarehouse::start_expedition(lua_State* L) {
> +
> +	Warehouse* Wh = get(L, get_egbase(L));
> +
> +	if (!Wh) {
> +		return 0;
> +	}
> +
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		PortDock* pd = Wh->get_portdock();
> +		if (!pd) {
> +			return 0;
> +		}
> +		if (!pd->expedition_started()){
> +			game->send_player_start_or_cancel_expedition(*Wh);
> +			return 1;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +/* RST
> +	.. method:: cancel_expedition(port)
> +
> +		:arg port
> +
> +		Cancels an expedition if in progress
> +
> +*/
> +int LuaWarehouse::cancel_expedition(lua_State* L) {
> +
> +	Warehouse* Wh = get(L, get_egbase(L));
> +
> +	if (!Wh) {
> +		return 0;
> +	}
> +
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		PortDock* pd = Wh->get_portdock();
> +			if (!pd) {
> +				return 0;
> +			}
> +		if (pd->expedition_started()){
> +			game->send_player_start_or_cancel_expedition(*Wh);
> +			return 1;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  /*
>   ==========================================================
>   C METHODS
>   ==========================================================
>   */
>  
> -
>  /* RST
>  ProductionSite
>  --------------
> @@ -3179,6 +3266,7 @@
>  	{nullptr, nullptr},
>  };
>  const PropertyType<LuaBob> LuaBob::Properties[] = {
> +	PROP_RO(LuaBob, field),
>  	{nullptr, nullptr, nullptr},
>  };
>  
> @@ -3189,6 +3277,27 @@
>   */
>  
>  /* RST
> +	.. attribute:: field //working here
> +
> +		(RO) The field the bob is located on
> +*/
> +// UNTESTED
> +int LuaBob::get_field(lua_State * L) {
> +
> +	EditorGameBase & egbase = get_egbase(L);
> +
> +	Coords coords = get(L, egbase)->get_position();
> +
> +	return to_lua<LuaMaps::LuaField>(L, new LuaMaps::LuaField(coords.x, coords.y));
> +}
> +
> +
> +/*
> + ==========================================================
> + LUA METHODS
> + ==========================================================
> + */
> +/* RST
>  	.. method:: has_caps(capname)
>  
>  		Similar to :meth:`Field::has_caps`.
> @@ -3214,13 +3323,6 @@
>  	return 1;
>  }
>  
> -
> -/*
> - ==========================================================
> - LUA METHODS
> - ==========================================================
> - */
> -
>  /*
>   ==========================================================
>   C METHODS
> @@ -3240,12 +3342,16 @@
>  const MethodType<LuaShip> LuaShip::Methods[] = {
>  	METHOD(LuaShip, get_wares),
>  	METHOD(LuaShip, get_workers),
> +	METHOD(LuaShip, build_colonization_port),
>  	{nullptr, nullptr},
>  };
>  const PropertyType<LuaShip> LuaShip::Properties[] = {
>  	PROP_RO(LuaShip, debug_economy),
>  	PROP_RO(LuaShip, last_portdock),
>  	PROP_RO(LuaShip, destination),
> +	PROP_RO(LuaShip, state),
> +	PROP_RW(LuaShip, scouting_direction),
> +	PROP_RW(LuaShip, island_explore_direction),
>  	{nullptr, nullptr, nullptr},
>  };
>  
> @@ -3285,6 +3391,149 @@
>  	return upcasted_map_object_to_lua(L, get(L, egbase)->get_lastdock(egbase));
>  }
>  
> +/* RST
> +	.. attribute:: state
> +
> +	Query which state the ship is in:
> +
> +	- transport,
> +	- exp_waiting, exp_scouting, exp_found_port_space, exp_colonizing,
> +	- sink_request, sink_animation
> +
> +		(RW) returns the :class:`string` ship's state, or :const:`nil` if there is no valid state.
> +
> +
> +*/
> +// UNTESTED sink states
> +int LuaShip::get_state(lua_State* L) {
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		switch (get(L, get_egbase(L))->get_ship_state()) {
> +			case Ship::TRANSPORT:
> +				lua_pushstring(L, "transport");
> +				break;
> +			case Ship::EXP_WAITING:
> +				lua_pushstring(L, "exp_waiting");
> +				break;
> +			case Ship::EXP_SCOUTING:
> +				lua_pushstring(L, "exp_scouting");
> +				break;
> +			case Ship::EXP_FOUNDPORTSPACE:
> +				lua_pushstring(L, "exp_found_port_space");
> +				break;
> +			case Ship::EXP_COLONIZING:
> +				lua_pushstring(L, "exp_colonizing");
> +				break;
> +			case Ship::SINK_REQUEST:
> +				lua_pushstring(L, "sink_request");
> +				break;
> +			case Ship::SINK_ANIMATION:
> +				lua_pushstring(L, "sink_animation");
> +				break;
> +			default:
> +				lua_pushnil(L);
> +				return 0;
> +			}
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +int LuaShip::get_scouting_direction(lua_State* L) {
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		switch (get(L, get_egbase(L))->get_scouting_direction()) {
> +			case WalkingDir::WALK_NE:
> +				lua_pushstring(L, "ne");
> +				break;
> +			case WalkingDir::WALK_E:
> +				lua_pushstring(L, "e");
> +				break;
> +			case WalkingDir::WALK_SE:
> +				lua_pushstring(L, "se");
> +				break;
> +			case WalkingDir::WALK_SW:
> +				lua_pushstring(L, "sw");
> +				break;
> +			case WalkingDir::WALK_W:
> +				lua_pushstring(L, "w");
> +				break;
> +			case WalkingDir::WALK_NW:
> +				lua_pushstring(L, "nw");
> +				break;
> +			default:
> +				return 0;
> +			}
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +int LuaShip::set_scouting_direction(lua_State* L) {
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		std::string dirname = luaL_checkstring(L, 3);
> +		WalkingDir dir = WalkingDir::IDLE;
> +
> +		if (dirname == "ne") {
> +			dir = WalkingDir::WALK_NE;
> +		} else if (dirname == "e") {
> +			dir = WalkingDir::WALK_E;
> +		} else if (dirname == "se") {
> +			dir = WalkingDir::WALK_SE;
> +		} else if (dirname == "sw") {
> +			dir = WalkingDir::WALK_SW;
> +		} else if (dirname == "w") {
> +			dir = WalkingDir::WALK_W;
> +		} else if (dirname == "nw") {
> +			dir = WalkingDir::WALK_NW;
> +		} else {
> +			return 0;
> +		}
> +		game->send_player_ship_scouting_direction(*get(L, get_egbase(L)), dir);
> +		return 1;
> +	}
> +	return 0;
> +
> +}
> +
> +/* RST
> +	.. attribute:: island_explore_direction
> +
> +		(RW) actual direction if the ship sails around an island.
> +		Sets/returns cw, ccw or nil
> +
> +*/
> +int LuaShip::get_island_explore_direction(lua_State* L) {
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		switch (get(L, get_egbase(L))->get_island_explore_direction()) {
> +			case IslandExploreDirection::kCounterClockwise:
> +				lua_pushstring(L, "ccw");
> +				break;
> +			case IslandExploreDirection::kClockwise:
> +				lua_pushstring(L, "cw");
> +				break;
> +			default:
> +				return 0;
> +		}
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +int LuaShip::set_island_explore_direction(lua_State* L) {
> +	if (upcast(Game, game, &get_egbase(L))) {
> +		Ship* ship = get(L, get_egbase(L));
> +		std::string dir = luaL_checkstring(L, 3);
> +		if (dir == "ccw"){
> +			 game->send_player_ship_explore_island(*ship,  IslandExploreDirection::kCounterClockwise);
> +		} else if (dir == "cw") {
> +			 game->send_player_ship_explore_island(*ship, IslandExploreDirection::kClockwise);
> +		} else {
> +			return 0;
> +		}
> +		return 1;
> +	}
> +	return 0;
> +}
> +
>  /*
>   ==========================================================
>   LUA METHODS
> @@ -3341,6 +3590,25 @@
>  	return 1;
>  }
>  
> +/* RST
> +	.. method:: build_colonization_port()
> +
> +		Returns true if port space construction was started (ship was in adequate
> +		status and a found portspace was nearby)
> +
> +		:returns: true/false
> +*/
> +int LuaShip::build_colonization_port(lua_State* L) {
> +	Ship* ship =  get(L, get_egbase(L));
> +	if (ship->get_ship_state() == Widelands::Ship::EXP_FOUNDPORTSPACE) {
> +		if (upcast(Game, game, &get_egbase(L))) {
> +			game->send_player_ship_construct_port(*ship, ship->exp_port_spaces()->front());
> +			return 1;
> +		}
> +	}
> +	return 0;
> +}
> +
>  /*
>   ==========================================================
>   C METHODS
> 
> === modified file 'src/scripting/lua_map.h'
> --- src/scripting/lua_map.h	2015-02-12 21:03:20 +0000
> +++ src/scripting/lua_map.h	2015-04-07 13:33:49 +0000
> @@ -688,6 +688,7 @@
>  	 * Properties
>  	 */
>  	int get_portdock(lua_State* L);
> +	int get_expedition_in_progress(lua_State* L);
>  
>  	/*
>  	 * Lua Methods
> @@ -698,6 +699,8 @@
>  	int set_workers(lua_State*);
>  	int set_soldiers(lua_State*);
>  	int get_soldiers(lua_State*);
> +	int start_expedition(lua_State*);
> +	int cancel_expedition(lua_State*);
>  
>  	/*
>  	 * C Methods
> @@ -806,6 +809,7 @@
>  	/*
>  	 * Properties
>  	 */
> +	int get_field(lua_State *);
>  	int has_caps(lua_State *);
>  
>  	/*
> @@ -885,12 +889,17 @@
>  	int get_debug_economy(lua_State * L);
>  	int get_last_portdock(lua_State* L);
>  	int get_destination(lua_State* L);
> -
> +	int get_state(lua_State* L);
> +	int get_scouting_direction(lua_State* L);
> +	int set_scouting_direction(lua_State* L);
> +	int get_island_explore_direction(lua_State* L);
> +	int set_island_explore_direction(lua_State* L);
>  	/*
>  	 * Lua methods
>  	 */
>  	int get_wares(lua_State* L);
>  	int get_workers(lua_State* L);
> +	int build_colonization_port(lua_State* L);
>  
>  	/*
>  	 * C methods
> 
> === modified file 'src/wui/shipwindow.cc'
> --- src/wui/shipwindow.cc	2015-02-05 12:11:20 +0000
> +++ src/wui/shipwindow.cc	2015-04-07 13:33:49 +0000
> @@ -68,9 +68,9 @@
>  	void act_destination();
>  	void act_sink();
>  	void act_cancel_expedition();
> -	void act_scout_towards(uint8_t);
> +	void act_scout_towards(WalkingDir);
>  	void act_construct_port();
> -	void act_explore_island(ScoutingDirection);
> +	void act_explore_island(IslandExploreDirection);
>  
>  private:
>  	InteractiveGameBase & m_igbase;
> @@ -120,7 +120,7 @@
>  		m_btn_explore_island_cw =
>  			make_button
>  				(exp_top, "expcw", _("Explore the island’s coast clockwise"), pic_explore_cw,
> -				 boost::bind(&ShipWindow::act_explore_island, this, ScoutingDirection::kClockwise));
> +				 boost::bind(&ShipWindow::act_explore_island, this, IslandExploreDirection::kClockwise));
>  		exp_top->add(m_btn_explore_island_cw, 0, false);
>  
>  		m_btn_scout[WALK_NE - 1] =
> @@ -156,7 +156,7 @@
>  		m_btn_explore_island_ccw =
>  			make_button
>  				(exp_bot, "expccw", _("Explore the island’s coast counter clockwise"), pic_explore_ccw,
> -				 boost::bind(&ShipWindow::act_explore_island, this, ScoutingDirection::kCounterClockwise));
> +				 boost::bind(&ShipWindow::act_explore_island, this, IslandExploreDirection::kCounterClockwise));
>  		exp_bot->add(m_btn_explore_island_ccw, 0, false);
>  
>  		m_btn_scout[WALK_SE - 1] =
> @@ -312,11 +312,11 @@
>  }
>  
>  /// Sends a player command to the ship to scout towards a specific direction
> -void ShipWindow::act_scout_towards(uint8_t direction) {
> +void ShipWindow::act_scout_towards(WalkingDir direction) {
>  	// ignore request if the direction is not swimable at all
> -	if (!m_ship.exp_dir_swimable(direction))
> +	if (!m_ship.exp_dir_swimable(static_cast<Direction>(direction)))
>  		return;
> -	m_igbase.game().send_player_ship_scout_direction(m_ship, direction);
> +	m_igbase.game().send_player_ship_scouting_direction(m_ship, direction);
>  }
>  
>  /// Constructs a port at the port build space in vision range
> @@ -327,7 +327,7 @@
>  }
>  
>  /// Explores the island cw or ccw
> -void ShipWindow::act_explore_island(ScoutingDirection direction) {
> +void ShipWindow::act_explore_island(IslandExploreDirection direction) {
>  	bool coast_nearby = false;
>  	bool moveable = false;
>  	for (Direction dir = 1; (dir <= LAST_DIRECTION) && (!coast_nearby || !moveable); ++dir) {
> 
> === modified file 'test/maps/expedition.wmf/scripting/init.lua'
> --- test/maps/expedition.wmf/scripting/init.lua	2014-08-01 15:30:12 +0000
> +++ test/maps/expedition.wmf/scripting/init.lua	2015-04-07 13:33:49 +0000
> @@ -93,24 +93,6 @@
>     assert_equal(1, port:get_workers("builder"))
>  end
>  
> -function start_expedition()
> -   assert_true(click_building(p1, "port"))
> -   sleep(100)
> -   assert_true(click_button("start_expedition"))
> -   sleep(100)
> -   close_windows()
> -   sleep(100)
> -end
> -
> -function cancel_expedition_in_port()
> -   assert_true(click_building(p1, "port"))
> -   sleep(100)
> -   assert_true(click_button("cancel_expedition"))
> -   sleep(100)
> -   close_windows()
> -   sleep(100)
> -end
> -
>  function cancel_expedition_in_shipwindow(which_ship)
>     click_on_ship(which_ship or first_ship)
>     assert_true(click_button("cancel_expedition"))
> @@ -174,7 +156,7 @@
>     game.desired_speed = 10 * 1000
>  
>     -- Start a new expedition.
> -   start_expedition()
> +   port:start_expedition()
>     wait_for_message("Expedition Ready")
>     game.desired_speed = 10 * 1000
>     sleep(10000)
> @@ -205,14 +187,15 @@
>     game.desired_speed = 10 * 1000
>  
>     -- Start a new expedition.
> -   start_expedition()
> +   port:start_expedition()
>     wait_for_message("Expedition Ready")
>     game.desired_speed = 10 * 1000
>     sleep(10000)
>  
> -   click_on_ship(first_ship)
> -   assert_true(click_button("expccw"))
> -   sleep(8000)
> +   first_ship.island_explore_direction="ccw"
> +   sleep(2000)
> +   assert_equal("ccw",first_ship.island_explore_direction)
> +   sleep(6000)
>  
>     stable_save("sailing")
>     assert_equal(1, p1:get_workers("builder"))
> @@ -235,13 +218,14 @@
>     game.desired_speed = 10 * 1000
>  
>     -- Send expedition to port space.
> -   start_expedition()
> +   port:start_expedition()
>     wait_for_message("Expedition Ready")
>     assert_equal(1, p1:get_workers("builder"))
>     sleep(500)
>  
> -   click_on_ship(first_ship)
> -   assert_true(click_button("expccw"))
> +   first_ship.island_explore_direction="ccw"
> +   sleep(2000)
> +   assert_equal("ccw",first_ship.island_explore_direction)
>     wait_for_message("Port Space Found")
>     sleep(500)
>     assert_equal(1, p1:get_workers("builder"))
> @@ -272,12 +256,13 @@
>     port:set_wares("blackwood", 100)
>  
>  
> -   start_expedition()
> +   port:start_expedition()
>     wait_for_message("Expedition Ready")
> -   click_on_ship(first_ship)
> -   assert_true(click_button("expccw"))
> +   first_ship.island_explore_direction="ccw"
> +   sleep(2000)
> +   assert_equal("ccw",first_ship.island_explore_direction)
>     wait_for_message("Port Space Found")
> -   assert_true(click_button("buildport"))
> +   first_ship:build_colonization_port()
>     sleep(500)
>     assert_equal(1, p1:get_workers("builder"))
>     wait_for_message("Port")
> 
> === added file 'test/maps/expedition.wmf/scripting/test_ship_movement_controls.lua'
> --- test/maps/expedition.wmf/scripting/test_ship_movement_controls.lua	1970-01-01 00:00:00 +0000
> +++ test/maps/expedition.wmf/scripting/test_ship_movement_controls.lua	2015-04-07 13:33:49 +0000
> @@ -0,0 +1,115 @@
> +run(function()

Awesome test!

> +   game.desired_speed = 30 * 1000
> +	p1:place_bob("ship", map:get_field(10, 10))
> +
> +	port = map:get_field(16, 16).immovable
> + 	port:set_wares("log", 10) -- no sense to wait
> +	port:set_wares("blackwood", 10)
> +
> +	--getting table with all our ships (single one only)
> +	ships = p1:get_ships()
> +
> +	--veryfing that ship is indeed placed where should be :)
> +	assert_equal(10,ships[1].field.x)
> +	assert_equal(10,ships[1].field.y)
> +
> +	--ships table should contain 1 item (1 ship)
> +  	assert_equal(1, #ships)
> +
> +  	--ship has no wares on it
> +  	assert_equal(0,ships[1]:get_wares())
> +
> +  	--no destination is set
> +  	assert(not ships[1].destination)
> +
> +  	--ships in transport state
> +  	assert_equal("transport", ships[1].state)
> +
> +	--the  warehouse is probably not in expedition state :)
> +	assert(not map:get_field(8, 18).immovable.expedition_in_progress)
> +
> +	--starting prepartion for expedition
> +	assert(not port.expedition_in_progress)
> +	port:start_expedition()
> +	sleep (300)
> +	assert(port.expedition_in_progress)
> +
> +	--ships changes state when exp ready
> +	while ships[1].state == "transport" do sleep(2000) end
> +	assert_equal("exp_waiting", ships[1].state)
> +
> + 	--sending NW and verifying
> +	ships[1].scouting_direction="nw"
> +	sleep(6000)
> +  	assert_equal("nw", ships[1].scouting_direction)
> +  	assert_equal("exp_scouting", ships[1].state)
> +
> +	while ships[1].scouting_direction == "nw" do
> +		sleep (2000)
> +	end
> +
> +	--now ships stops nearby NW coast, so sending it back
> +	ships[1].scouting_direction="se"
> +	sleep(4000)
> +	assert_equal("se", ships[1].scouting_direction)
> +
> +	--testing remaining directions
> +	ships[1].scouting_direction="e"
> +	sleep(2000)
> +	assert_equal("e", ships[1].scouting_direction)
> +
> +	ships[1].scouting_direction="w"
> +	sleep(2000)
> +	assert_equal("w", ships[1].scouting_direction)
> +
> +	ships[1].scouting_direction="sw"
> +	sleep(2000)
> +	assert_equal("sw", ships[1].scouting_direction)
> +
> +	ships[1].scouting_direction="ne"
> +	sleep(2000)
> +	assert_equal("ne", ships[1].scouting_direction)
> +
> +	--back to original course
> +	ships[1].scouting_direction="se"
> +	sleep(2000)
> +	assert_equal("se", ships[1].scouting_direction)
> +
> +	--waiting till it stops (no direction/nil is returned)
> +	while ships[1].scouting_direction do sleep(2000) end
> +
> +	--sending to scout the island
> +	ships[1].island_explore_direction="ccw";
> +	sleep(3000)
> +	assert_equal("ccw", ships[1].island_explore_direction)
> +	assert_equal("exp_scouting", ships[1].state)
> +
> +	--fine, now change the direction
> +	ships[1].island_explore_direction="cw";
> +	sleep(3000)
> +	assert_equal("cw", ships[1].island_explore_direction)
> +
> +	-- wait till it finds a port
> +	wait_for_message("Port Space Found")
> +	sleep(500)
> +	assert_equal("exp_found_port_space", ships[1].state)
> +
> +	--starting colonization port here
> +	assert(ships[1]:build_colonization_port())
> +	sleep(500)
> +	assert_equal("exp_colonizing", ships[1].state)
> +	sleep(15000)
> +	stable_save("port_in_constr")
> +
> +	-- while unfinished yet, removing it
> +	new_port=map:get_field(16,2).immovable
> +	assert(new_port)
> +	new_port:remove()
> +	sleep(3000)
> +
> +	--yes, the ships is back in transport mode
> +	assert_equal("transport", ships[1].state)
> +
> +	print("# All Tests passed.")
> +	wl.ui.MapView():close()
> +end)
> 
> === modified file 'test/maps/expedition.wmf/scripting/test_starting_and_immediately_canceling.lua'
> --- test/maps/expedition.wmf/scripting/test_starting_and_immediately_canceling.lua	2013-10-29 20:22:08 +0000
> +++ test/maps/expedition.wmf/scripting/test_starting_and_immediately_canceling.lua	2015-04-07 13:33:49 +0000
> @@ -5,8 +5,12 @@
>  
>     -- Start and immediately cancel an expedition.
>     print("---- 1 -----")
> -   start_expedition()
> -   cancel_expedition_in_port()
> +   port:start_expedition()
> +   sleep(500)
> +   assert(port.expedition_in_progress)
> +   port:cancel_expedition()
> +   sleep(500)
> +   assert(not port.expedition_in_progress)
>     sleep(500)
>     assert_equal(1, p1:get_workers("builder"))
>  
> 
> === modified file 'test/maps/expedition.wmf/scripting/test_starting_wait_a_while_cancel.lua'
> --- test/maps/expedition.wmf/scripting/test_starting_wait_a_while_cancel.lua	2013-10-29 20:22:08 +0000
> +++ test/maps/expedition.wmf/scripting/test_starting_wait_a_while_cancel.lua	2015-04-07 13:33:49 +0000
> @@ -4,12 +4,12 @@
>  
>     -- Start an expedition, but let them carry some wares into it. This also
>     -- gives the builder enough time to walk over.
> -   start_expedition()
> +   port:start_expedition()
>     sleep(50000)
>     stable_save("cancel_in_port")
>     assert_equal(1, p1:get_workers("builder"))
>  
> -   cancel_expedition_in_port()
> +   port:cancel_expedition()
>     sleep(500)
>     assert_equal(1, p1:get_workers("builder"))
>  
> 
> === modified file 'test/maps/ship_transportation.wmf/scripting/init.lua'
> --- test/maps/ship_transportation.wmf/scripting/init.lua	2015-02-10 21:25:14 +0000
> +++ test/maps/ship_transportation.wmf/scripting/init.lua	2015-04-07 13:33:49 +0000
> @@ -37,23 +37,6 @@
>     return nil
>  end
>  
> -function portdock2()
> -	local portdock = map:get_field(15, 4).immovable
> -	if portdock then
> -		return portdock
> -	end
> -	local portdock = map:get_field(14, 5).immovable
> -	if portdock then
> -		return portdock
> -	end
> -	local portdock = map:get_field(14, 4).immovable
> -	if portdock then
> -		return portdock
> -	end
> -	print ("portdock not found")
> -	return nill
> -end
> -
>  function start_building_farm()
>     p1:place_building("farm", map:get_field(18, 4), true, true)
>     connected_road(p1, map:get_field(18,5).immovable, "l,l|tl,tr|", true)
> 
> === modified file 'test/maps/ship_transportation.wmf/scripting/test_rip_portdock_with_worker_and_ware_in_transit.lua'
> --- test/maps/ship_transportation.wmf/scripting/test_rip_portdock_with_worker_and_ware_in_transit.lua	2015-02-10 21:25:14 +0000
> +++ test/maps/ship_transportation.wmf/scripting/test_rip_portdock_with_worker_and_ware_in_transit.lua	2015-04-07 13:33:49 +0000
> @@ -32,7 +32,9 @@
>   	stable_save("restored_port")
>     
>     -- remove the portdock while the blackwood is in transit.
> -   portdock2():remove()
> +   port2_portdock=port2().portdock
> +   assert(port2_portdock)
> +   port2_portdock:remove()
>     
>     sleep(5000)
>  
> 
> === modified file 'test/maps/ship_transportation.wmf/scripting/test_rip_second_port_with_worker_in_portdock.lua'
> --- test/maps/ship_transportation.wmf/scripting/test_rip_second_port_with_worker_in_portdock.lua	2014-01-18 12:40:08 +0000
> +++ test/maps/ship_transportation.wmf/scripting/test_rip_second_port_with_worker_in_portdock.lua	2015-04-07 13:33:49 +0000
> @@ -5,6 +5,13 @@
>     create_first_port()
>     create_second_port()
>  
> +   --removing portdock first
> +   portdock_fields=port2().portdock.fields
> +   portdock_fields[1].immovable:remove()
> +   sleep(100)
> +   --portdock should be back, as port is still there
> +   assert (portdock_fields[1].immovable) 
> +   
>     start_building_farm()
>     port1():set_workers{
>        builder = 1,
> @@ -16,8 +23,13 @@
>     assert_equal(p1:get_workers("builder"), 1)
>     assert_equal(port1():get_workers("builder"), 0)
>  
> +   portdock_fields=port2().portdock.fields
>     port2():remove()
>     sleep(100)
> +   --verify that also portdock was removed
> +   assert (not portdock_fields[1].immovable)
> +   
> +   sleep(100)
>  
>     stable_save("worker_in_portdock")
>  
> 


-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1380287/+merge/252507
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/bug-1380287.


References