172 lines
4.0 KiB
Plaintext
172 lines
4.0 KiB
Plaintext
note
|
|
description: "[
|
|
Command for moving groups of ships from the turn card to the board.
|
|
]"
|
|
author: "Jimmy J. Johnson"
|
|
|
|
class
|
|
REINFORCE_COMMAND
|
|
|
|
inherit
|
|
|
|
VITP_COMMAND
|
|
redefine
|
|
text,
|
|
execute,
|
|
undo,
|
|
is_executable
|
|
end
|
|
|
|
create
|
|
make
|
|
|
|
feature {NONE} -- Initialization
|
|
|
|
make (a_game: VITP_GAME)
|
|
-- Create an instance
|
|
do
|
|
default_create
|
|
create moves.make
|
|
create repositions.make
|
|
create joins.make
|
|
create rebasings.make
|
|
vitp_game := a_game
|
|
affected_objects.extend (a_game)
|
|
end
|
|
|
|
feature -- Access
|
|
|
|
vitp_game: VITP_GAME
|
|
-- The game in which this command executes.
|
|
|
|
text: STRING
|
|
-- Description of the command
|
|
do
|
|
Result := "Reinforce"
|
|
end
|
|
|
|
feature -- Basic operations
|
|
|
|
execute
|
|
-- Perform the action
|
|
-- Multiple ships come on as a task force, multiple LBA come
|
|
-- on together, as do multiple amphibious units.
|
|
local
|
|
sop: VITP_SEQUENCE_OF_PLAY
|
|
do
|
|
Precursor {VITP_COMMAND}
|
|
-- Get the ships
|
|
sop := vitp_game.sequence_of_play
|
|
if sop.player = {NATIONALITY_CONSTANTS}.japanese then
|
|
place_units (vitp_game.arriving_japanese_ships (sop.turn))
|
|
place_units (vitp_game.arriving_japanese_air_units (sop.turn))
|
|
place_units (vitp_game.arriving_japanese_amphibious_units (sop.turn))
|
|
place_units (vitp_game.arriving_japanese_submarines (sop.turn))
|
|
else
|
|
place_units (vitp_game.arriving_allied_ships (sop.turn))
|
|
place_units (vitp_game.arriving_allied_air_units (sop.turn))
|
|
place_units (vitp_game.arriving_allied_amphibious_units (sop.turn))
|
|
place_units (vitp_game.arriving_allied_submarines (sop.turn))
|
|
end
|
|
end
|
|
|
|
undo
|
|
-- Reverse the effects of executing the command
|
|
do
|
|
Precursor {VITP_COMMAND}
|
|
from joins.start
|
|
until joins.after
|
|
loop
|
|
joins.item.undo
|
|
joins.forth
|
|
end
|
|
from repositions.start
|
|
until repositions.after
|
|
loop
|
|
repositions.item.undo
|
|
repositions.forth
|
|
end
|
|
from moves.start
|
|
until moves.after
|
|
loop
|
|
moves.item.undo
|
|
moves.forth
|
|
end
|
|
end
|
|
|
|
feature -- Status report
|
|
|
|
is_executable: BOOLEAN
|
|
-- Can the command be executed?
|
|
local
|
|
sop: VITP_SEQUENCE_OF_PLAY
|
|
do
|
|
sop := vitp_game.sequence_of_play
|
|
Result := Precursor {VITP_COMMAND} and
|
|
sop.is_reinforcement_step
|
|
end
|
|
|
|
moves: LINKED_LIST [MOVE_COMMAND]
|
|
-- List of commands that move all the reinforcements
|
|
|
|
repositions: LINKED_LIST [REPOSITION_COMMAND]
|
|
-- List of commands that change the position of the reinforcements
|
|
|
|
rebasings: LINKED_LIST [REBASE_COMMAND]
|
|
-- List of commands that change the `home_port' of the reinforcement
|
|
|
|
joins: LINKED_LIST [JOIN_TASK_FORCE_COMMAND]
|
|
-- List of commands that cause units to form a task force
|
|
|
|
feature {NONE} -- Implementation
|
|
|
|
|
|
place_units (a_group: VITP_TABLE [ATTACK_UNIT])
|
|
-- Get `a_group' [i.e. a unit type] and place in game
|
|
require
|
|
group_exists: a_group /= Void
|
|
local
|
|
sop: VITP_SEQUENCE_OF_PLAY
|
|
u, u2: ATTACK_UNIT
|
|
tab: VITP_TABLE [ATTACK_UNIT]
|
|
move_com: MOVE_COMMAND
|
|
pos_com: REPOSITION_COMMAND
|
|
rebase_com: REBASE_COMMAND
|
|
join_com: JOIN_TASK_FORCE_COMMAND
|
|
ht: HASH_TABLE [LINKED_LIST [ATTACK_UNIT], LOCATION] -- units entering given location
|
|
u_list: LINKED_LIST [ATTACK_UNIT]
|
|
do
|
|
sop := vitp_game.sequence_of_play
|
|
create ht.make (100)
|
|
tab := vitp_game.turn_x_units (sop.turn, a_group)
|
|
from tab.start
|
|
until tab.after
|
|
loop
|
|
u := tab.item_for_iteration
|
|
create move_com.make (u, u.arrival_location)
|
|
create pos_com.make (u, u.arrival_position)
|
|
create rebase_com.make (u, u.arrival_port)
|
|
moves.extend (move_com)
|
|
repositions.extend (pos_com)
|
|
rebasings.extend (rebase_com)
|
|
move_com.execute
|
|
pos_com.execute
|
|
rebase_com.execute
|
|
if ht.has (u.arrival_location) then
|
|
check attached {LINKED_LIST [ATTACK_UNIT]} ht.item (u.arrival_location) as otl_list then
|
|
u2 := otl_list.first
|
|
create join_com.make (u, u2, false)
|
|
joins.extend (join_com)
|
|
join_com.execute
|
|
end
|
|
else
|
|
create u_list.make
|
|
u_list.extend (u)
|
|
ht.extend (u_list, u.arrival_location)
|
|
end
|
|
tab.forth
|
|
end
|
|
end
|
|
|
|
end
|