note
	description: "[
		Representation of a ship in VITP.
		]"
	author: "Jimmy J. Johnson"

deferred class
	SHIP

inherit

	ATTACK_UNIT
		redefine
			is_bottomed,
			internal_is_movable
		end

feature -- Status report

	is_sunk: BOOLEAN
			-- Has this ship been sunk?
		do
			Result := (is_at_sea and damage > defense_factor) or
						(not is_at_sea and damage > 2 * defense_factor)
		end

	is_bottomed: BOOLEAN
			-- Is this ship in port with too much damage to sail?
		do
			Result := is_in_port and damage <= 2 * defense_factor
		end

feature -- Basic operations

	return_to_port (a_port: PORT)
		require
--			is_return_allowed: is_at_sea and then a_port.controller = nationality and then
--				(location.adjoins (a_port) or else a_port.is_major)
		do
			location := a_port
		end

	repair
			-- Do repairs on the ship
		require
--			is_in_port: location.is_port
			port_has_repair_capability:
		do

		end

	set_patrolling
			-- Make Current [and other `task_force' units] a patrol force
		require
			can_patrol: is_patrollable
		do
			from task_force.start
			until task_force.is_after
			loop
				if attached {SHIP} task_force.item as s and then s.is_patrollable then
					s.internal_set_raiding (false)
				end
				task_force.forth
			end
			is_raiding := False
		ensure
			is_patrolling: is_patrolling
		end

	set_raiding
			-- Make Current [and other `task_force' units] a raid force
		require
			can_raid: is_raidable
		do
			from task_force.start
			until task_force.is_after
			loop
				if attached {SHIP} task_force.item as s and then s.is_raidable then
					s.internal_set_raiding (true)
				end
				task_force.forth
			end
			is_raiding := true
		ensure
			is_raiding: is_raiding
		end

feature -- Status report

	is_patrolling: BOOLEAN
			-- Is this unit a patroller (as opposed to a raider)?
		do
			Result := not is_raiding
		end

	is_raiding: BOOLEAN
			-- Is this unit a raider?

	is_patrollable: BOOLEAN = True
			-- Can this unit be a patroller for area control purposes?

	is_raidable: BOOLEAN
			-- Can this unit be a raider?

feature -- Query

	is_incompatible_position (a_position: VITP_POSITION): BOOLEAN
			-- Is `a_position' located on a unit with which Current is NOT
			-- allowed to `join_force' (e.g. on a submarine or an enemy)?
		local
			tf: TASK_FORCE
			u_list: VITP_TABLE [ATTACK_UNIT]
			au: ATTACK_UNIT
		do
			if not is_in_game then
				Result := false
--			elseif i_boat.contains_position (a_position) or f_boat.contains_position (a_position) then
--				Result := true
			else
				if nationality = game.japanese then
					u_list := game.allied_attack_units
				else
					u_list := game.japanese_attack_units
				end
				from u_list.start
				until u_list.after or else Result
				loop
					au := u_list.item_for_iteration
					Result := au.is_in_game and then au.contains_position (a_position)
					u_list.forth
				end
			end
				-- Temp for testing
			Result := false
		end

feature {SHIP} -- Implementation

	internal_set_raiding (a_value: BOOLEAN)
			-- Used by `set_patrolling' and `set_raiding' to change
			-- status of a single unit in Current's `task_force'
		do
			is_raiding := a_value
		end

feature {NONE} -- Implmentation

	internal_is_movable: BOOLEAN
			-- Can Current (not the `task_force') move at this time?
		local
			sop: VITP_SEQUENCE_OF_PLAY
		do
			sop :=game.sequence_of_play
			Result := Precursor {ATTACK_UNIT}
				-- Account for turn-1 ships that can't move.
			if Result and then sop.turn = 1 and sop.is_allied_player then
					-- Only some allied ships can move on turn 1
				Result := (Current = game.de_ruyter or Current = game.exeter or
						 Current = game.houston or Current = game.australia or
						 Current = game.canberra)
			end
		end

end
