19928/jj_vitp/Implementation/classes/units/ship.e

165 lines
3.6 KiB
Plaintext
Raw Normal View History

2024-06-17 07:09:33 +00:00
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