19928/jj_vitp/Interface/commands/reinforce_command.e
Jocelyn Fiat 6dde6425c2 init
2024-06-17 09:09:33 +02:00

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