190 lines
4.7 KiB
Plaintext
190 lines
4.7 KiB
Plaintext
|
note
|
||
|
description: "[
|
||
|
Represents one of the air force attack units in VITP.
|
||
|
]"
|
||
|
author: "Jimmy J. Johnson"
|
||
|
|
||
|
deferred class
|
||
|
AMPHIBIOUS_UNIT
|
||
|
|
||
|
inherit
|
||
|
|
||
|
ATTACK_UNIT
|
||
|
redefine
|
||
|
landable_ports,
|
||
|
arrival_location,
|
||
|
-- arrival_position,
|
||
|
internal_is_movable
|
||
|
end
|
||
|
|
||
|
feature -- Access
|
||
|
|
||
|
arrival_location: LOCATION
|
||
|
-- The port at which this unit may enter the game
|
||
|
do
|
||
|
if is_returning_unit then
|
||
|
if nationality = game.japanese then
|
||
|
Result := game.uncommitted_japanese_location
|
||
|
else
|
||
|
Result := game.uncommitted_allied_location
|
||
|
end
|
||
|
else
|
||
|
Result := Precursor
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- arrival_position: like position
|
||
|
-- -- The location (latitude/longitude-like coordinates) where Current
|
||
|
-- -- will enter the game
|
||
|
-- do
|
||
|
-- if nationality = game.japanese then
|
||
|
-- Result := [300, 70]
|
||
|
-- else
|
||
|
-- Result := [680, 300]
|
||
|
-- end
|
||
|
-- end
|
||
|
|
||
|
patrollable_sea_areas: LINKED_SET [SEA_AREA]
|
||
|
-- A list containing each {SEA_AREA} which Current can patrol
|
||
|
-- from its `home_port' at this point in the game
|
||
|
local
|
||
|
s: LINEAR [SEA_AREA]
|
||
|
s2: LINEAR [SEA_AREA]
|
||
|
a: SEA_AREA
|
||
|
do
|
||
|
create Result.make
|
||
|
if attached {MOVE_AMPHIBIOUS_STEP} game.sequence_of_play then
|
||
|
-- Current can go to any sea area adjacent to its `home_port'
|
||
|
check attached home_port as p then
|
||
|
s := p.adjacent_sea_areas
|
||
|
from s.start
|
||
|
until s.after
|
||
|
loop
|
||
|
a := s.item
|
||
|
Result.extend (a)
|
||
|
-- It can also go to a second sea area if first is not enemy's
|
||
|
if not a.is_enemy_controlled (nationality) then
|
||
|
s2 := a.adjacent_sea_areas
|
||
|
from s2.start
|
||
|
until s2.exhausted
|
||
|
loop
|
||
|
Result.extend (s2.item)
|
||
|
s2.forth
|
||
|
end
|
||
|
end
|
||
|
s.forth
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
raidable_sea_areas: LINKED_SET [SEA_AREA]
|
||
|
-- A list containing each {SEA_AREA} which Current can raid
|
||
|
-- from its `home_port' at this point in the game
|
||
|
local
|
||
|
s: like patrollable_sea_areas
|
||
|
do
|
||
|
create Result.make
|
||
|
end
|
||
|
|
||
|
landable_ports: LINKED_SET [PORT]
|
||
|
-- A list containing each {PORT} at which Current can
|
||
|
-- make a landing at this point in the game
|
||
|
local
|
||
|
lin: LINEAR [PORT]
|
||
|
do
|
||
|
io.put_string ("AMPHIBIOUS_UNIT.landable_ports: fix to account for retreats--rule 13.4 %N")
|
||
|
create Result.make
|
||
|
-- if game.stage = {GAME_SEQUENCE}.Landing_amphibious or
|
||
|
-- game.stage = {GAME_SEQUENCE}.Post_combat_amphibious_landing or
|
||
|
-- game.stage = {GAME_SEQUENCE}.End_of_turn_amphibious_landing then
|
||
|
-- if attached {SEA_AREA} location as s then
|
||
|
-- lin := s.adjoining_ports
|
||
|
-- from lin.start
|
||
|
-- until lin.exhausted
|
||
|
-- loop
|
||
|
-- Result.extend (lin.item)
|
||
|
-- lin.forth
|
||
|
-- end
|
||
|
-- end
|
||
|
-- end
|
||
|
end
|
||
|
|
||
|
feature -- Status report
|
||
|
|
||
|
is_sunk: BOOLEAN
|
||
|
-- Is this unit sunk?
|
||
|
do
|
||
|
Result := (is_at_sea or is_in_port) and damage > defense_factor
|
||
|
end
|
||
|
|
||
|
is_patrollable: BOOLEAN = False
|
||
|
-- Can this unit be a patroller for area control purposes?
|
||
|
|
||
|
is_raidable: BOOLEAN = False
|
||
|
-- Can this unit be a raider?
|
||
|
|
||
|
is_patrolling: BOOLEAN = False
|
||
|
-- Is this unit a patroller (as opposed to a raider)?
|
||
|
|
||
|
is_raiding: BOOLEAN = False
|
||
|
-- Is this unit 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 game.i_boat.contains_position (a_position) or game.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.contains_position (a_position)
|
||
|
u_list.forth
|
||
|
end
|
||
|
end
|
||
|
-- Temp for testing
|
||
|
Result := false
|
||
|
end
|
||
|
|
||
|
feature {NONE} -- Implementation
|
||
|
|
||
|
internal_can_patrol: BOOLEAN = False
|
||
|
-- Can this game piece be a patroller?
|
||
|
|
||
|
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 := is_in_game and not (is_sunk or is_bottomed) and then
|
||
|
((sop.is_allied_player and is_allied) or
|
||
|
(sop.is_japanese_player and is_japanese)) and then
|
||
|
((sop.is_moving_amphibious_step))
|
||
|
if Result and 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
|