19928/jj_vitp/Implementation/classes/units/task_force.e

184 lines
3.5 KiB
Plaintext
Raw Normal View History

2024-06-17 07:09:33 +00:00
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