184 lines
3.5 KiB
Plaintext
184 lines
3.5 KiB
Plaintext
|
note
|
||
|
description: "[
|
||
|
A list of ships that move as a unit.
|
||
|
]"
|
||
|
author: "Jimmy J. Johnson"
|
||
|
|
||
|
class
|
||
|
TASK_FORCE
|
||
|
|
||
|
inherit
|
||
|
|
||
|
VITP_ITEM
|
||
|
undefine
|
||
|
copy,
|
||
|
is_equal
|
||
|
redefine
|
||
|
make
|
||
|
end
|
||
|
|
||
|
JJ_SORTABLE_SET [ATTACK_UNIT]
|
||
|
rename
|
||
|
make as list_make,
|
||
|
extend as list_extend -- to strengthen the precondition
|
||
|
export
|
||
|
-- {TASK_FORCE}
|
||
|
-- all
|
||
|
-- {ATTACK_UNIT}
|
||
|
|
||
|
{ANY}
|
||
|
item,
|
||
|
-- count,
|
||
|
-- i_th,
|
||
|
-- first,
|
||
|
start,
|
||
|
is_after,
|
||
|
forth
|
||
|
-- has,
|
||
|
-- prunable,
|
||
|
-- is_empty
|
||
|
redefine
|
||
|
-- default_create,
|
||
|
-- make,
|
||
|
-- make_filled,
|
||
|
-- prune,
|
||
|
new_filled_list
|
||
|
end
|
||
|
|
||
|
create
|
||
|
make
|
||
|
|
||
|
feature {NONE} -- Initialization
|
||
|
|
||
|
make (a_game: like game)
|
||
|
-- Initialize Current
|
||
|
do
|
||
|
list_make (10)
|
||
|
Precursor {VITP_ITEM} (a_game)
|
||
|
-- column_count := 1
|
||
|
-- name := "No name"
|
||
|
end
|
||
|
|
||
|
-- make (a_count: INTEGER)
|
||
|
-- -- Initialize Current to initial capacity of `a_count'
|
||
|
-- do
|
||
|
-- item_make ("No name", Nobody)
|
||
|
-- Precursor {JJ_SORTABLE_SET} (a_count)
|
||
|
-- column_count := 1
|
||
|
-- end
|
||
|
|
||
|
-- make_filled (a_count: INTEGER)
|
||
|
-- -- Initialize Current to initial capacity of `a_count'
|
||
|
-- do
|
||
|
-- item_make ("No name", Nobody)
|
||
|
-- Precursor (a_count)
|
||
|
-- column_count := 1
|
||
|
-- end
|
||
|
|
||
|
new_filled_list (n: INTEGER): like Current
|
||
|
-- Redefined to get past void-safety issues, but `duplicate'
|
||
|
-- from {ARRAYED_LIST} will not work
|
||
|
do
|
||
|
check
|
||
|
do_not_call: False then
|
||
|
-- because redefined to appease void safety
|
||
|
end
|
||
|
end
|
||
|
|
||
|
feature -- Access
|
||
|
|
||
|
name: STRING_8
|
||
|
-- The displayed name for this widget
|
||
|
do
|
||
|
Result := "{" + generating_type + "} "
|
||
|
if count >= 1 then
|
||
|
Result := Result + i_th (1).name
|
||
|
else
|
||
|
Result := Result + " not named"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
feature {ATTACK_UNIT} -- Basic operations
|
||
|
|
||
|
extend (a_unit: like item)
|
||
|
-- Ensure `a_unit' is included in the force
|
||
|
require
|
||
|
unit_exists: a_unit /= Void
|
||
|
correct_nationality: not is_empty implies not a_unit.is_opposed (first)
|
||
|
same_location: not is_empty implies a_unit.location = first.location
|
||
|
local
|
||
|
old_f: detachable like item
|
||
|
do
|
||
|
is_stable := false
|
||
|
if not is_empty and then not (a_unit.location = first.location) then
|
||
|
a_unit.set_location (first.location)
|
||
|
end
|
||
|
list_extend (a_unit)
|
||
|
-- name := " Task Force " + id.out + " " + first.name
|
||
|
nationality := first.nationality
|
||
|
is_stable := true
|
||
|
end
|
||
|
|
||
|
assemble
|
||
|
-- Bring all units close together.
|
||
|
-- Graphical elements will be stacked
|
||
|
do
|
||
|
is_dispersed := false
|
||
|
|
||
|
end
|
||
|
|
||
|
disperse
|
||
|
-- Spread units out.
|
||
|
-- Graphical elements will be tiled
|
||
|
do
|
||
|
is_dispersed := true
|
||
|
end
|
||
|
|
||
|
feature -- Status report
|
||
|
|
||
|
is_dispersed: BOOLEAN
|
||
|
-- Are the units spread apart?
|
||
|
-- Changed with `disperse' and `assemble'.
|
||
|
|
||
|
is_stable: BOOLEAN
|
||
|
-- Used by invariant for referential integrity checking
|
||
|
|
||
|
feature {NONE} -- Implementation
|
||
|
|
||
|
-- column_count: INTEGER
|
||
|
-- -- The number of columns in which to arrange the force
|
||
|
|
||
|
-- counter: INTEGER_32_REF
|
||
|
-- -- Used to create a unique name when a group is created
|
||
|
-- once
|
||
|
-- create Result
|
||
|
-- end
|
||
|
|
||
|
-- has_invalid_unit: BOOLEAN
|
||
|
-- -- Does Current contain a unit that does not refer back to Current
|
||
|
-- -- For invariant checking
|
||
|
-- -- Should be False
|
||
|
-- require
|
||
|
-- call_only_when_stable: is_stable
|
||
|
-- local
|
||
|
-- u: ATTACK_UNIT
|
||
|
-- c: CURSOR
|
||
|
-- do
|
||
|
-- c := cursor
|
||
|
-- from start
|
||
|
-- until after or Result
|
||
|
-- loop
|
||
|
-- u := item
|
||
|
-- Result := u.is_stable implies u.task_force /= Current
|
||
|
-- forth
|
||
|
-- end
|
||
|
-- go_to (c)
|
||
|
-- end
|
||
|
|
||
|
invariant
|
||
|
|
||
|
-- column_count_big_enough: column_count >= 1
|
||
|
-- column_count_small_enough: column_count <= count
|
||
|
|
||
|
end
|