NEW_UI: can highlight buttons now to show unit action; added documentation
This commit is contained in:
parent
5a32c8faa6
commit
bfb0cc6852
5 changed files with 540 additions and 39 deletions
|
@ -36,6 +36,7 @@
|
|||
<li>Future 1.19 Release<p>
|
||||
<ul>
|
||||
<li>++
|
||||
<li>NEW_UI: Can highlight buttons now to show actions (from Martin Renold).
|
||||
<li>Removed old pathfinder, A-Star is not an option now (from Russell Smith).
|
||||
<li>Added MinRange to Orders, Pathfinder finds correct paths for a ranged attack now (from Russell Smith).
|
||||
<li>Corrected calculation of MapDistanceBetweenUnits (from Russell Smith).
|
||||
|
|
|
@ -47,7 +47,50 @@
|
|||
<a href="unittype.html">NEXT</a>
|
||||
<a href="ccl-index.html">Index</a>
|
||||
<hr>
|
||||
<a href="#define-button">define-button</a>
|
||||
<a href="#add-button">add-button</a>
|
||||
<a href="#set-selection-changed-hook">set-selection-changed-hook</a>
|
||||
<a href="#set-selected-unit-changed-hook">set-selected-unit-changed-hook</a>
|
||||
<a href="#set-choose-target-begin-hook">set-choose-target-begin-hook</a>
|
||||
<a href="#set-choose-target-finish-hook">set-choose-target-finish-hook</a>
|
||||
<a href="#add-button">add-button</a>
|
||||
<a href="#remove-button">remove-button</a>
|
||||
<a href="#remove-all-buttons">remove-all-buttons</a>
|
||||
|
||||
<a href="#command-patrol">command-patrol</a>
|
||||
<a href="#command-harvest">command-harvest</a>
|
||||
<a href="#command-attack">command-attack</a>
|
||||
<a href="#command-cancel-upgrade">command-cancel-upgrade</a>
|
||||
<a href="#command-build">command-build</a>
|
||||
<a href="#command-train-unit">command-train-unit</a>
|
||||
<a href="#command-cast-spell">command-cast-spell</a>
|
||||
<a href="#command-move">command-move</a>
|
||||
<a href="#command-stop">command-stop</a>
|
||||
<a href="#command-research">command-research</a>
|
||||
<a href="#command-unload">command-unload</a>
|
||||
<a href="#command-upgrade-to">command-upgrade-to</a>
|
||||
<a href="#command-attack-ground">command-attack-ground</a>
|
||||
<a href="#command-return-goods">command-return-goods</a>
|
||||
<a href="#command-cancel">command-cancel</a>
|
||||
<a href="#command-cancel-building">command-cancel-building</a>
|
||||
<a href="#command-cancel-train-unit">command-cancel-train-unit</a>
|
||||
<a href="#command-repair">command-repair</a>
|
||||
<a href="#command-stand-ground">command-stand-ground</a>
|
||||
<a href="#command-demolish">command-demolish</a>
|
||||
|
||||
<a href="#check-allowed">check-allowed</a>
|
||||
<a href="#get-cost-string">get-cost-string</a>
|
||||
|
||||
<a href="#selected-is-building">selected-is-building</a>
|
||||
<a href="#selected-is-training">selected-is-training</a>
|
||||
<a href="#selected-is-upgrading">selected-is-upgrading</a>
|
||||
<a href="#selected-get-race">selected-get-race</a>
|
||||
<a href="#selected-get-speed">selected-get-speed</a>
|
||||
<a href="#selected-owned-by-player">selected-owned-by-player</a>
|
||||
<a href="#selected-mixed-units">selected-mixed-units</a>
|
||||
<a href="#selected-get-action">selected-get-action</a>
|
||||
<a href="#selected-resource-loaded">selected-resource-loaded</a>
|
||||
<a href="#selected-draw-buttons">selected-draw-buttons</a>
|
||||
|
||||
<a href="#define-cursor">define-cursor</a>
|
||||
<a href="#define-font">define-font</a>
|
||||
<a href="#define-font-colors">define-font-colors</a>
|
||||
|
@ -64,46 +107,30 @@
|
|||
|
||||
Everything around the user interface.
|
||||
<h2>Functions</h2>
|
||||
<a name="define-button"></a>
|
||||
<h3>(define-button 'tag1 value1 'tag2 value2 ...)</h3>
|
||||
<a name="add-button"></a>
|
||||
<h3>(add-button 'tag1 value1 'tag2 value2 ...)</h3>
|
||||
|
||||
Define a button in the button panel show during the game. Possible tags:
|
||||
Add a button to the button panel during the game. This is usually
|
||||
called from the 'button-hook of the unittypes (FIXME link), or from
|
||||
the selection-changed-hook (FIXME link) directly.
|
||||
See also (remove-all-buttons) (FIXME link)<br>
|
||||
Possible tags:
|
||||
|
||||
<dl>
|
||||
<dt>forunit</dt>
|
||||
<dd>List of units the button applies to, or '(*) for all units.
|
||||
</dd>
|
||||
<dt>pos</dt>
|
||||
<dd>Position number.
|
||||
<dd>Position number. Currently buttons can be added only to the button
|
||||
panel.
|
||||
<pre>
|
||||
0 1 2
|
||||
3 4 5
|
||||
6 7 8
|
||||
</pre>
|
||||
</dd>
|
||||
<dt>level</dt>
|
||||
<dd>Visible when in this button level (0 default, 9 cancel-only)
|
||||
</dd>
|
||||
<dt>icon</dt>
|
||||
<dd>Name of the icon to display.
|
||||
</dd>
|
||||
<dt>action</dt>
|
||||
<dd>Action to perform when the button is clicked. Can be any of the following:
|
||||
move, stop, attack, repair, harvest, button, build, train-unit, patrol,
|
||||
stand-ground, attack-ground, return-goods, demolish, cast-spell, research,
|
||||
upgrade-to, unload, cancel, cancel-upgrade, cancel-train-unit, cancel-build.
|
||||
</dd>
|
||||
<dt>value</dt>
|
||||
<dd>Optional value associated with the action.
|
||||
</dd>
|
||||
<dt>allowed</dt>
|
||||
<dd>Optional check to see if a button is allowed. Can be any of the following:
|
||||
check-true, check-false, check-upgrade, check-units-or, check-units-and,
|
||||
check-network, check-no-work, check-no-research, check-attack,
|
||||
check-upgrade-to, check-research, check-single-research.
|
||||
</dd>
|
||||
<dt>allowarg</dt>
|
||||
<dd>Optional argument used by the allowed function.
|
||||
<dd>Script to eval when the button is pressed.
|
||||
</dd>
|
||||
<dt>key</dt>
|
||||
<dd>Shortcut key for the button.
|
||||
|
@ -111,17 +138,394 @@ check-upgrade-to, check-research, check-single-research.
|
|||
<dt>hint</dt>
|
||||
<dd>Hint to be displayed for the button.
|
||||
</dd>
|
||||
<dt>highlight</dt>
|
||||
<dd>If given and true, highlight the button by drawing an extra border
|
||||
(used for showing actions).
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(define-button 'pos 9 'level 0 'icon 'icon-exorcism
|
||||
'action 'cast-spell 'value 'spell-exorcism
|
||||
'allowed 'check-upgrade 'allow-arg '(upgrade-exorcism)
|
||||
'key "e" 'hint "~!EXORCISM"
|
||||
'for-unit '(unit-paladin unit-knight-rider unit-man-of-light))
|
||||
;; add a patrol button
|
||||
(add-button 'pos 4
|
||||
'icon (string-append "icon-" (selected-get-race) "-patrol-land")
|
||||
'key "p" 'hint "~!PATROL"
|
||||
'action (lambda () (command-patrol)))
|
||||
</pre>
|
||||
|
||||
<a name="remove-button"></a>
|
||||
<h3>(remove-button id)</h3>
|
||||
Remove button number id.
|
||||
<h4>Example</h4>
|
||||
(remove-button 4)
|
||||
<pre>
|
||||
</pre>
|
||||
|
||||
<a name="remove-all-buttons"></a>
|
||||
<h3>(remove-all-buttons)</h3>
|
||||
Removes all buttons from the button panel.
|
||||
|
||||
<a name="set-selection-changed-hook"></a>
|
||||
<h3>(set-selection-changed-hook '(begin ...))</h3>
|
||||
Set the script that will be evaluated whenever the player selects an other set of units.
|
||||
You will probably want call things like <a href="#remove-all-buttons">remove-all-buttons</a>
|
||||
and <a href="#add-button">add-button</a> here, after examining the selection with other helper functions.
|
||||
<p>
|
||||
I suggest you define a helper function that rebuilds the buttons, and
|
||||
call it from both selection-changed-hook and
|
||||
<a href="#set-selected-unit-changed-hook">selected-unit-changed-hook</a>.
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
; (Those are extracts from the demogame ccls)
|
||||
|
||||
; FIXME: this is most likely a very ugly hack to scheme
|
||||
(define (set-global symbol value)
|
||||
(set-symbol-value! symbol value nil))
|
||||
(define (get-global symbol)
|
||||
(symbol-value symbol nil))
|
||||
|
||||
(set-selection-changed-hook '(begin
|
||||
(set-global 'button-level 0)
|
||||
(rebuild-buttons)))
|
||||
|
||||
(set-selected-unit-changed-hook '(begin
|
||||
(rebuild-buttons)))
|
||||
|
||||
; Build all the command buttons from scratch.
|
||||
(define (rebuild-buttons)
|
||||
(remove-all-buttons)
|
||||
(if (selected-owned-by-player) (begin
|
||||
; draw some generic buttons
|
||||
(if (= (get-global 'button-level) 0) (begin
|
||||
(if (> (selected-get-speed) 0) (begin
|
||||
(generic-movement-buttons)
|
||||
(if (selected-mixed-units) (begin
|
||||
(generic-combat-buttons))
|
||||
; Uniform selection: draw the unit's own buttons
|
||||
(selected-draw-buttons))))
|
||||
(if (selected-is-building) (begin
|
||||
; there can be only one building selected
|
||||
; no common buttons should be here for now,
|
||||
; "destroy building" or something could be added.
|
||||
(add-button 'pos 7
|
||||
'icon 'icon-move-peasant
|
||||
'key "m" 'hint "SET ~!MOVE"
|
||||
'action (lambda () (command-move)))
|
||||
;
|
||||
; Call the building's own button-draw hook
|
||||
;
|
||||
(selected-draw-buttons)
|
||||
; FIXME: maybe non-buildings could be upgrading too
|
||||
; note: upgrade is both researching and changing unit type
|
||||
(if (selected-is-upgrading) (begin
|
||||
; could be optimized by not calling (selected-draw-buttons)
|
||||
(remove-all-buttons)
|
||||
(add-button 'pos 9 'icon 'icon-cancel
|
||||
'key "\033" 'hint "~<ESC~> CANCEL UPGRADE"
|
||||
'action (lambda() (command-cancel-upgrade))))))))
|
||||
(begin ; else: button level is not zero
|
||||
;
|
||||
; Generic cancel button to go back to button level 0
|
||||
;
|
||||
(add-button 'pos 9 'icon 'icon-cancel
|
||||
'key "\033" 'hint "~<ESC~> CANCEL"
|
||||
'action (lambda()
|
||||
(set-global 'button-level 0)
|
||||
(rebuild-buttons)))
|
||||
;
|
||||
; Call the unit's own button-draw hook
|
||||
;
|
||||
(selected-draw-buttons))))))
|
||||
; no command buttons for enemy units.
|
||||
</pre>
|
||||
|
||||
<a name="set-selected-unit-changed-hook"></a>
|
||||
<h3>(set-selected-unit-changed-hook)</h3>
|
||||
|
||||
Set the script that will be evaluated when one of the selected units
|
||||
experiences some kind of upgrade, or when a global research is
|
||||
completed (this is when you might want new buttons to appear, or old
|
||||
ones to remove, or button images to be changed). This is seperated
|
||||
from <a href="#set-selection-changed-hook">set-selection-changed-hook</a>
|
||||
because you probably don't want to break out of a subbutton (eg selecting
|
||||
the building to build) here.
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(set-selected-unit-changed-hook '(begin
|
||||
(writes nil "[debug] selected-unit-changed-hook called")
|
||||
(rebuild-buttons)))
|
||||
</pre>
|
||||
|
||||
<a name="set-choose-target-begin-hook"></a>
|
||||
<h3>(set-choose-target-begin-hook)</h3>
|
||||
|
||||
Set the script that will be evaluated when the user is asked to select
|
||||
some target. You will want to change the buttons. FIXME: other hooks
|
||||
can interrupt the select-target process, so a global flag must be set
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
; When doing a target selection, only draw a cancel button.
|
||||
; If you leave them both empty, you can choose another building while
|
||||
; setting the destination and similar things.
|
||||
(set-choose-target-begin-hook '(begin
|
||||
(set-global 'button-level 9)
|
||||
(rebuild-buttons)))
|
||||
(set-choose-target-finish-hook '(begin
|
||||
(set-global 'button-level 0)
|
||||
(rebuild-buttons)))
|
||||
</pre>
|
||||
|
||||
<a name="set-choose-target-finish-hook"></a>
|
||||
<h3>(set-choose-target-finish-hook)</h3>
|
||||
Set the script that will be evaluated when the user has finished to
|
||||
select a target. See <a href="#set-choose-target-begin-hook">set-choose-target-begin-hook</a>
|
||||
for details.
|
||||
|
||||
<a name="command-patrol"></a>
|
||||
<h3>(command-patrol)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected units will patrol to.
|
||||
|
||||
<a name="command-harvest"></a>
|
||||
<h3>(command-harvest)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected units will harvest.
|
||||
|
||||
<a name="command-attack"></a>
|
||||
<h3>(command-attack)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected units will attack.
|
||||
|
||||
<a name="command-cancel-upgrade"></a>
|
||||
<h3>(command-cancel-upgrade)</h3>
|
||||
(While game is running) Cancel the upgrade the currently selected unit
|
||||
is doing.
|
||||
|
||||
<a name="command-build"></a>
|
||||
<h3>(command-build unittype)</h3>
|
||||
(While game is running) Let the player select a destination where a
|
||||
building will be placed. Costs are checked.
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(command-build 'unit-farm)
|
||||
</pre>
|
||||
|
||||
<a name="command-train-unit"></a>
|
||||
<h3>(command-train-unit unittype)</h3>
|
||||
(While game is running) Let the current unit train another unit (I
|
||||
wonder whether this works with non-buildings, too?)
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
; define a helper function to add training buttons
|
||||
(define (train-button type pos key hint)
|
||||
(if (check-allowed (string-append 'unit- type))
|
||||
(add-button
|
||||
'icon (string-append 'icon- type)
|
||||
'hint (string-append hint " " (get-cost-string (string-append 'unit- type)))
|
||||
'pos pos
|
||||
'key key
|
||||
'action (lambda ()
|
||||
(writes nil "Train-command\n")
|
||||
(command-train-unit (string-append 'unit- type))))))
|
||||
</pre>
|
||||
|
||||
<a name="command-cast-spell"></a>
|
||||
<h3>(command-cast-spell spellid)</h3>
|
||||
(While game is running) Let the current unit(selection) cast a spell.
|
||||
<br>FIXME: untested.
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
FIXME
|
||||
</pre>
|
||||
|
||||
<a name="command-move"></a>
|
||||
<h3>(command-move)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected units will move to.
|
||||
|
||||
<a name="command-stop"></a>
|
||||
<h3>(command-stop)</h3>
|
||||
(While game is running) stop the selected units.
|
||||
|
||||
<a name="command-research"></a>
|
||||
<h3>(command-research upgrade)</h3>
|
||||
(While game is running) Command the selected unit to research the
|
||||
given upgrade.
|
||||
|
||||
<a name="command-unload"></a>
|
||||
<h3>(command-unload)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected unit(s) will unload to.
|
||||
|
||||
<a name="command-upgrade-to"></a>
|
||||
<h3>(command-upgrade-to unittype)</h3>
|
||||
(While game is running) Command the selected unit to upgrade to
|
||||
another unittype.
|
||||
|
||||
<a name="command-attack-ground"></a>
|
||||
<h3>(command-attack-ground)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected unit(s) will attack a ground area.
|
||||
|
||||
<a name="command-return-goods"></a>
|
||||
<h3>(command-return-goods)</h3>
|
||||
(While game is running) Let the currently selected units return their
|
||||
goods.
|
||||
|
||||
<a name="command-cancel"></a>
|
||||
<h3>(command-cancel)</h3>
|
||||
(While game is running) This cancels selecting a
|
||||
destination. (FIXME: or is it used elsewhere too?)
|
||||
|
||||
<a name="command-cancel-building"></a>
|
||||
<h3>(command-cancel-building)</h3>
|
||||
(While game is running) This cancels building.
|
||||
(FIXME: does it work?)
|
||||
|
||||
<a name="command-cancel-train-unit"></a>
|
||||
<h3>(command-cancel-train-unit)</h3>
|
||||
(While game is running) Let the first selected unit remove one item
|
||||
from the training queue.
|
||||
(FIXME: or does it rather empty the training queue completely?)
|
||||
|
||||
<a name="command-repair"></a>
|
||||
<h3>(command-repair)</h3>
|
||||
(While game is running) Let the player select a destination that the
|
||||
currently selected units will repair.
|
||||
|
||||
<a name="command-stand-ground"></a>
|
||||
<h3>(command-stand-ground)</h3>
|
||||
Command the selected units not to move. (FIXME: correct?)
|
||||
|
||||
<a name="command-demolish"></a>
|
||||
<h3>(command-demolish)</h3>
|
||||
(While game is running) Let the player select a destination where the
|
||||
currently selected units go demolishing (explode there).
|
||||
|
||||
<a name="check-allowed"></a>
|
||||
<h3>(check-allowed thing)</h3>
|
||||
Check whether thing is allowed. Thing can be an upgrade or an unit.
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(if (check-allowed 'unit-keep)
|
||||
(add-button 'pos 2
|
||||
'icon 'icon-keep
|
||||
'key "k"
|
||||
'hint (string-append "UPGRADE TO ~!KEEP " (get-cost-string 'unit-keep))
|
||||
'action (lambda () (command-upgrade-to 'unit-keep))))
|
||||
</pre>
|
||||
|
||||
<a name="get-cost-string"></a>
|
||||
<h3>(get-cost-string thing)</h3>
|
||||
Returns a string with the costs of thing (unit or upgrade), useful to
|
||||
give as button hint.
|
||||
<br>
|
||||
The string contains the special characters like
|
||||
"$1" that will let a resource icon appear instead of the
|
||||
text.
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
'hint (string-append "UPGRADE TO ~!KEEP " (get-cost-string 'unit-keep))
|
||||
</pre>
|
||||
|
||||
<a name="selected-is-building"></a>
|
||||
<h3>(selected-is-building)</h3>
|
||||
Returns true if the selected unit is a building. FIXME: bad name
|
||||
|
||||
<a name="selected-is-training"></a>
|
||||
<h3>(selected-is-training)</h3>
|
||||
Returns true if the selected unit is training.
|
||||
|
||||
<a name="selected-is-upgrading"></a>
|
||||
<h3>(selected-is-upgrading)</h3>
|
||||
Returns true if the selected unit is upgrading.
|
||||
|
||||
<a name="selected-get-race"></a>
|
||||
<h3>(selected-get-race)</h3>
|
||||
Returns the race of the selected unit.
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
; not yet used, could be useful for something like
|
||||
'icon (string-append "icon-" (selected-get-race) "shield1")
|
||||
; if the icons are named properly
|
||||
</pre>
|
||||
|
||||
<a name="selected-get-speed"></a>
|
||||
<h3>(selected-get-speed)</h3>
|
||||
|
||||
Gets the speed of the selected unit, as defined in the
|
||||
unittype. Useful to decide whether to draw a movement button.
|
||||
<br>
|
||||
Note that the speed declared in the unittype is just to display something,
|
||||
the real unit speed is hidden in the animation script.
|
||||
|
||||
<a name="selected-owned-by-player"></a>
|
||||
<h3>(selected-owned-by-player)</h3>
|
||||
|
||||
Returns true if the selected unit(s) is owned by the current
|
||||
player.
|
||||
<br>
|
||||
Note that the player cannot select more than one enemy unit a
|
||||
a time.
|
||||
|
||||
<a name="selected-mixed-units"></a>
|
||||
<h3>(selected-mixed-units)</h3>
|
||||
Returns true if the selection contains more than one unittype.
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(if (selected-mixed-units) (begin
|
||||
; attack/stand/patrol buttons for mixed selections
|
||||
(generic-combat-buttons))
|
||||
; Uniform selection: draw the unit's own buttons
|
||||
(selected-draw-buttons))
|
||||
</pre>
|
||||
|
||||
<a name="selected-get-action"></a>
|
||||
<h3>(selected-get-action)</h3>
|
||||
Returns the name of the current action as a string. Possible values are:
|
||||
<p>
|
||||
Invalid (No unit selected), Mixed (multiple units selected, and they
|
||||
are doing different things), None, Still, StandGround, Follow, Move,
|
||||
Attack, AttackGround, Die, SpellCast, Train, Train, UpgradeTo,
|
||||
Research, Builded, Board, Unload, Patrol, Build, Repair, Resource,
|
||||
ReturnGoods, Demolish.
|
||||
<p>
|
||||
Note that those are case-sensitive.
|
||||
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(add-button 'pos 3
|
||||
'icon (string-append "icon-sword1")
|
||||
'key "a" 'hint "~!ATTACK"
|
||||
'highlight (= (strcmp (selected-get-action) 'Attack) 0)
|
||||
'action (lambda () (command-attack))))
|
||||
</pre>
|
||||
|
||||
<a name="selected-resource-loaded"></a>
|
||||
<h3>(selected-resource-loaded)</h3>
|
||||
Returns the name of the resource the selected units have loaded,
|
||||
'mixed if there are different resources loaded, or nil (false) if
|
||||
there are no resources loaded.
|
||||
<h4>Example</h4>
|
||||
<pre>
|
||||
(if (selected-resource-loaded) (begin
|
||||
(writes nil (string-append "[debug] Selected unit has loaded " (selected-resource-loaded) " resources.\n"))
|
||||
(add-button 'pos 6
|
||||
; could build icon string from the resource name :)
|
||||
'icon 'icon-return-goods-peasant
|
||||
'key "g" 'hint "RETURN WITH ~!GOODS"
|
||||
'action (lambda () (command-return-goods)))))
|
||||
</pre>
|
||||
|
||||
<a name="selected-draw-buttons"></a>
|
||||
<h3>(selected-draw-buttons)</h3>
|
||||
Run the 'add-buttons hook from the first selected unittype.
|
||||
|
||||
<a name="define-cursor"></a>
|
||||
<h3>(define-cursor 'ident 'race 'tag1 value1 'tag2 value2 ...)</h3>
|
||||
|
||||
|
|
|
@ -95,6 +95,7 @@ struct _button_action_ {
|
|||
char* UnitMask; /// for which units is it available
|
||||
#else
|
||||
SCM Action; /// script on button press
|
||||
int Highlight; /// whether to draw a border
|
||||
#endif
|
||||
IconConfig Icon; /// icon to display
|
||||
int Key; /// alternative on keyboard
|
||||
|
@ -316,7 +317,7 @@ extern int AddButton(int pos,int level,const char* IconIdent,
|
|||
int key,const char* hint,const char* umask);
|
||||
#else
|
||||
/// Add a new button to the command panel
|
||||
extern void AddButton(int pos, char *icon_ident, SCM action, int key, char *hint);
|
||||
extern void AddButton(int pos, char *icon_ident, SCM action, int key, char *hint, int highlight);
|
||||
/// Remove a single button from the panel
|
||||
global void RemoveButton(int pos);
|
||||
#endif
|
||||
|
|
|
@ -318,7 +318,7 @@ int AddButton(int pos, int level, const char *icon_ident,
|
|||
enum _button_cmd_ action, const char *value, const ButtonCheckFunc func,
|
||||
const void *allow, int key, const char *hint, const char *umask)
|
||||
#else
|
||||
global void AddButton(int pos, char *icon_ident, SCM action, int key, char *hint)
|
||||
global void AddButton(int pos, char *icon_ident, SCM action, int key, char *hint, int highlight)
|
||||
#endif
|
||||
{
|
||||
#ifndef NEW_UI
|
||||
|
@ -410,6 +410,7 @@ global void AddButton(int pos, char *icon_ident, SCM action, int key, char *hint
|
|||
ba->Hint = hint;
|
||||
MustRedraw|=RedrawButtonPanel;
|
||||
ba->Key = key;
|
||||
ba->Highlight = highlight;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -480,9 +481,7 @@ global void DrawButtonPanel(void)
|
|||
const ButtonAction* buttons;
|
||||
char buf[8];
|
||||
#else
|
||||
//const UnitStats* stats;
|
||||
const ButtonAction* ba;
|
||||
//char buf[8];
|
||||
#endif
|
||||
|
||||
//
|
||||
|
@ -513,8 +512,6 @@ global void DrawButtonPanel(void)
|
|||
for( i=0; i<9; ++i ) {
|
||||
ba = CurrentButtons + i;
|
||||
if( ba->Icon.Icon != NoIcon ) {
|
||||
//int j;
|
||||
//int action;
|
||||
#endif
|
||||
|
||||
// cursor is on that button
|
||||
|
@ -620,6 +617,10 @@ global void DrawButtonPanel(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if( ba->Highlight ) {
|
||||
v|=IconSelected;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef NEW_UI
|
||||
|
|
|
@ -496,6 +496,21 @@ local SCM CclSelectedIsBuilding(void)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** Whether the selected unit is repairing.
|
||||
*/
|
||||
local SCM CclSelectedIsRepairing(void)
|
||||
{
|
||||
if( NumSelected == 0) {
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
if( Selected[0]->Orders[0].Action==UnitActionTrain ) {
|
||||
return SCM_BOOL_T;
|
||||
} else {
|
||||
return SCM_BOOL_F;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** FIXME: docu
|
||||
*/
|
||||
|
@ -566,6 +581,33 @@ local SCM CclSelectedOwnedByPlayer(void)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** Return the name of the resource type that is loaded.
|
||||
*/
|
||||
local SCM CclSelectedResourceLoaded(void)
|
||||
{
|
||||
int i;
|
||||
int type;
|
||||
Unit * unit;
|
||||
type = -1;
|
||||
for ( i=0; i<NumSelected; i++ ) {
|
||||
unit = Selected[i];
|
||||
if( unit->CurrentResource && unit->Value &&
|
||||
(!unit->Type->ResInfo[unit->CurrentResource]->LoseResources ||
|
||||
unit->Value >= unit->Type->ResInfo[unit->CurrentResource]->ResourceCapacity) ) {
|
||||
if( type == -1 ) {
|
||||
type = unit->CurrentResource;
|
||||
} else if( type != unit->CurrentResource ) {
|
||||
return gh_str02scm("mixed");
|
||||
}
|
||||
}
|
||||
}
|
||||
if( type == -1 ) {
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
return gh_str02scm(DefaultResourceNames[type]);
|
||||
}
|
||||
|
||||
/**
|
||||
** FIXME: docu
|
||||
*/
|
||||
|
@ -586,6 +628,52 @@ local SCM CclSelectedMixedUnits(void)
|
|||
return SCM_BOOL_F;
|
||||
}
|
||||
|
||||
/**
|
||||
** FIXME: docu
|
||||
*/
|
||||
local SCM CclSelectedGetAction(void)
|
||||
{
|
||||
int j;
|
||||
UnitAction action;
|
||||
|
||||
if( NumSelected == 0 ) {
|
||||
return gh_str02scm("Invalid");
|
||||
}
|
||||
action = Selected[0]->Orders[0].Action;
|
||||
for( j=1; j<NumSelected; ++j ) {
|
||||
if( Selected[j]->Orders[0].Action!=action ) {
|
||||
return gh_str02scm("Mixed");
|
||||
}
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
case UnitActionNone: return gh_str02scm("None");
|
||||
case UnitActionStill: return gh_str02scm("Still"); break;
|
||||
case UnitActionStandGround: return gh_str02scm("StandGround"); break;
|
||||
case UnitActionFollow: return gh_str02scm("Follow"); break;
|
||||
case UnitActionMove: return gh_str02scm("Move"); break;
|
||||
case UnitActionAttack: return gh_str02scm("Attack"); break;
|
||||
case UnitActionAttackGround: return gh_str02scm("AttackGround"); break;
|
||||
case UnitActionDie: return gh_str02scm("Die"); break;
|
||||
case UnitActionSpellCast: return gh_str02scm("SpellCast"); break;
|
||||
case UnitActionTrain: return gh_str02scm("Train"); break;
|
||||
case UnitActionUpgradeTo: return gh_str02scm("UpgradeTo"); break;
|
||||
case UnitActionResearch: return gh_str02scm("Research"); break;
|
||||
case UnitActionBuilded: return gh_str02scm("Builded"); break;
|
||||
case UnitActionBoard: return gh_str02scm("Board"); break;
|
||||
case UnitActionUnload: return gh_str02scm("Unload"); break;
|
||||
case UnitActionPatrol: return gh_str02scm("Patrol"); break;
|
||||
case UnitActionBuild: return gh_str02scm("Build"); break;
|
||||
case UnitActionRepair: return gh_str02scm("Repair"); break;
|
||||
case UnitActionResource: return gh_str02scm("Resource"); break;
|
||||
case UnitActionReturnGoods: return gh_str02scm("ReturnGoods"); break;
|
||||
case UnitActionDemolish: return gh_str02scm("Demolish"); break;
|
||||
default:
|
||||
DebugLevel0Fn("FIXME: invalid action id %d\n" _C_ action);
|
||||
return gh_str02scm("invalid");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** FIXME: docu
|
||||
*/
|
||||
|
@ -3149,6 +3237,10 @@ local SCM CclAddButton(SCM list)
|
|||
s1=gh_scm2newstr(value,NULL);
|
||||
ba.Key=*s1;
|
||||
free(s1);
|
||||
} else if( gh_eq_p(value,gh_symbol2scm("highlight")) ) {
|
||||
value=gh_car(list);
|
||||
list=gh_cdr(list);
|
||||
ba.Highlight=gh_scm2bool(value);
|
||||
} else if( gh_eq_p(value,gh_symbol2scm("hint")) ) {
|
||||
value=gh_car(list);
|
||||
list=gh_cdr(list);
|
||||
|
@ -3162,7 +3254,7 @@ local SCM CclAddButton(SCM list)
|
|||
|
||||
|
||||
// maxy: allocated memory goes into currentButtons[], must not be freed
|
||||
AddButton(pos,ba.Icon.Name,ba.Action,ba.Key,ba.Hint);
|
||||
AddButton(pos,ba.Icon.Name,ba.Action,ba.Key,ba.Hint,ba.Highlight);
|
||||
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
|
@ -3721,6 +3813,8 @@ global void UserInterfaceCclRegister(void)
|
|||
gh_new_procedure0_0("selected-get-speed",CclSelectedGetSpeed);
|
||||
gh_new_procedure0_0("selected-owned-by-player",CclSelectedOwnedByPlayer);
|
||||
gh_new_procedure0_0("selected-mixed-units",CclSelectedMixedUnits);
|
||||
gh_new_procedure0_0("selected-get-action",CclSelectedGetAction);
|
||||
gh_new_procedure0_0("selected-resource-loaded",CclSelectedResourceLoaded);
|
||||
gh_new_procedure0_0("selected-draw-buttons",CclSelectedDrawButtons);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue