init
This commit is contained in:
164
jj_vitp/Implementation/classes/units/ship.e
Normal file
164
jj_vitp/Implementation/classes/units/ship.e
Normal file
@@ -0,0 +1,164 @@
|
||||
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
|
Reference in New Issue
Block a user