Skip to content

Commit 570a7e7

Browse files
author
tom
committed
Log icones BBCode, bouton fin manche fixe, couleurs iles rehaussees.
GameOrder.bbcode_label: piece+camp en couleur, secteurs en icones. AI planner: texte remplace par bbcode_label. OrdersLog fit_content=false: bouton toujours visible. _tint luminance min 0.55: iles plus saturees.
1 parent 10013bb commit 570a7e7

8 files changed

Lines changed: 119 additions & 20 deletions

File tree

godot/CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@ Format des entrées : `AAAA-MM-JJ HH:MM:SS` (heure locale, fuseau du commit Git
88

99
---
1010

11+
## 2026-05-25 (nuit 3) — Log icônes, bouton ▶ fixé, couleurs îles rehaussées
12+
13+
### Bouton ▶ toujours visible
14+
- `OrdersLog` : `fit_content = false` + `scroll_following = true` — le log n'étire plus la sidebar et ne pousse plus le bouton hors de l'écran.
15+
- `OrdersQueue` : `custom_minimum_size = (0, 56)` pour un espace minimal garanti.
16+
17+
### Log sans texte — 100 % icônes colorées
18+
- `GameOrder.bbcode_label()` — format compact BBCode : `[color=camp]piece_sym[/color] secteur_from→secteur_to`
19+
- HQ → `[color=camp]⚑[/color]`, mer → gris, île → couleur camp
20+
- Achat : `[color=camp]+sym[/color]`, échange : `sym→sym`, H-bombe : `H☠dest`
21+
- AI planner : `◈ IA N` (N = initial difficulté) + ordres en `bbcode_label()` — plus de "Tank : HQ_Blue → Ice_SW"
22+
- Séparateur de manche : `── R2 ──` (discret) au lieu de "Fin manche 2" en gras
23+
24+
### Couleurs îles
25+
- `_tint()` : luminance remappée sur **[0.55, 1.0]** — les zones sombres de l'atlas gardent la teinte cible sans virer au noir
26+
- `CAMP_TINT` : valeurs compensées pour que le rendu multiply atteigne les hex Unity (`#8b3040`, `#4a3578`, `#2a6e6a`, `#8a6a30`)
27+
28+
---
29+
1130
## 2026-05-25 (nuit 2) — Design plateau : fidélité Unity (fond, îles, surbrillances, sidebar)
1231

1332
**Référence** : captures Unity `Screenshot_20260525-000216_Forc2.jpg` / `000226`.
770 Bytes
Loading

godot/scenes/battle/battle.tscn

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,17 @@ text = "⏱"
188188
unique_name_in_owner = true
189189
layout_mode = 2
190190
bbcode_enabled = true
191-
fit_content = true
191+
fit_content = false
192+
custom_minimum_size = Vector2(0, 56)
192193
text = ""
193194

194195
[node name="OrdersLog" type="RichTextLabel" parent="Sidebar/OrdersPanel/VBox"]
195196
unique_name_in_owner = true
196197
layout_mode = 2
197198
size_flags_vertical = 3
198199
bbcode_enabled = true
199-
fit_content = true
200+
fit_content = false
201+
scroll_following = true
200202
text = ""
201203

202204
[node name="MenuRow" type="HBoxContainer" parent="Sidebar"]

godot/scripts/ai/ai_planner.gd

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ static func run_all_ai(state: GameState) -> Array[String]:
3333
if not GameSession.is_ai(camp):
3434
continue
3535
var diff: GameSession.Difficulty = GameSession.slot_difficulty(camp)
36-
logs.append("[b]IA %s[/b] (%s)" % [
37-
GameConstants.camp_to_string(camp),
38-
GameSession.difficulty_label(diff),
36+
var cc: String = GameOrder._camp_hex(camp)
37+
logs.append("[color=%s]◈[/color] IA [color=%s]%s[/color]" % [
38+
cc, cc, GameSession.difficulty_label(diff).left(1).to_upper(),
3939
])
4040
logs.append_array(plan_turn(state, camp, diff))
4141
return logs
@@ -60,7 +60,9 @@ static func plan_turn(state: GameState, camp: GameConstants.Camp, difficulty: Ga
6060
continue
6161
var err: String = state.try_move_piece(piece, dest)
6262
if err.is_empty():
63-
logs.append(" · %s : %s%s" % [piece.label(), piece.sector_id, dest])
63+
var order: GameOrder = state.orders_for_camp(camp).back()
64+
if order != null:
65+
logs.append(" " + order.bbcode_label())
6466
_maybe_ai_buy(state, camp, difficulty, rng, logs)
6567
_maybe_ai_deploy(state, camp, difficulty, rng, logs)
6668
_maybe_ai_exchange(state, camp, difficulty, rng, logs)
@@ -252,7 +254,9 @@ static func _maybe_ai_buy(
252254
var pick: GameConstants.PieceType = types[rng.randi_range(0, types.size() - 1)]
253255
var err: String = state.try_buy_to_reserve(camp, pick)
254256
if err.is_empty():
255-
logs.append(" · achat réserve")
257+
var order: GameOrder = state.orders_for_camp(camp).back()
258+
if order != null:
259+
logs.append(" " + order.bbcode_label())
256260

257261

258262
static func _maybe_ai_deploy(
@@ -278,7 +282,9 @@ static func _maybe_ai_deploy(
278282
continue
279283
var err: String = state.try_deploy_from_reserve(piece, hq)
280284
if err.is_empty():
281-
logs.append(" · déploiement sur QG")
285+
var order: GameOrder = state.orders_for_camp(camp).back()
286+
if order != null:
287+
logs.append(" " + order.bbcode_label())
282288
return
283289

284290

@@ -300,7 +306,9 @@ static func _maybe_ai_exchange(
300306
GameConstants.PieceType.BOMBER,
301307
]:
302308
if state.try_exchange_to_reserve(camp, result_type).is_empty():
303-
logs.append(" · échange elite")
309+
var order: GameOrder = state.orders_for_camp(camp).back()
310+
if order != null:
311+
logs.append(" " + order.bbcode_label())
304312
return
305313

306314

@@ -323,4 +331,6 @@ static func _maybe_ai_hbomb(
323331
if rng.randf() > 0.35:
324332
return
325333
if state.try_place_hbomb(camp, hq).is_empty():
326-
logs.append(" · bombe H")
334+
var order: GameOrder = state.orders_for_camp(camp).back()
335+
if order != null:
336+
logs.append(" " + order.bbcode_label())

godot/scripts/battle/battle.gd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func _log_last_order() -> void:
202202
if orders.is_empty():
203203
return
204204
var last: GameOrder = orders[orders.size() - 1]
205-
_log.append_text("[color=#c8a878]%s[/color]\n" % last.pad_label())
205+
_log.append_text(last.bbcode_label() + "\n")
206206

207207

208208
func _phase_name(phase: GameConstants.GamePhase) -> String:
@@ -402,7 +402,7 @@ func _on_deploy_pressed() -> void:
402402
func _on_end_round_pressed() -> void:
403403
if _state.phase != GameConstants.GamePhase.PLANNING:
404404
return
405-
_log.append_text("\n[b]Fin manche %d[/b]\n" % _state.round_number)
405+
_log.append_text("[color=#555577]── R%d ──[/color]\n" % _state.round_number)
406406
for line: String in AiPlanner.run_all_ai(_state):
407407
_log.append_text(line + "\n")
408408
var conflict_sectors := _conflict_sectors()

godot/scripts/battle/battle_sidebar.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ static func _format_orders_queue(state: GameState, human_camp: GameConstants.Cam
166166
var max_o: int = GameConstants.MAX_ORDERS_PER_ROUND
167167
var lines: PackedStringArray = PackedStringArray()
168168
for order: GameOrder in state.orders_for_camp(human_camp):
169-
lines.append("[color=#e8a060]%s[/color]" % order.pad_label())
169+
lines.append(order.bbcode_label())
170170
if lines.is_empty():
171171
lines.append("[color=#888]—[/color]")
172172
lines.append("[color=#aaa](%d/%d)[/color]" % [used, max_o])

godot/scripts/core/game_order.gd

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,62 @@ func pad_label() -> String:
7171
_:
7272
return "O : ?"
7373

74+
75+
## Format BBCode : icônes pièce + couleur camp, sans texte.
76+
func bbcode_label() -> String:
77+
var cc: String = _camp_hex(camp)
78+
var ps: String = _piece_sym(piece_type)
79+
match kind:
80+
Kind.MOVE:
81+
return "[color=%s]%s[/color] %s%s" % [
82+
cc, ps,
83+
_sector_bbcode(from_sector),
84+
_sector_bbcode(to_sector),
85+
]
86+
Kind.DEPLOY_FROM_RESERVE:
87+
return "[color=%s]%s[/color] ↓→%s" % [cc, ps, _sector_bbcode(to_sector)]
88+
Kind.BUY:
89+
return "[color=%s]+%s[/color]" % [cc, ps]
90+
Kind.EXCHANGE:
91+
return "[color=%s]%s%s[/color]" % [cc, ps, _piece_sym(exchange_result)]
92+
Kind.HBOMB_PLACE:
93+
return "[color=%s]H→%s[/color]" % [cc, _sector_bbcode(to_sector)]
94+
Kind.HBOMB_STRIKE:
95+
return "[color=%s]H☠%s[/color]" % [cc, _sector_bbcode(to_sector)]
96+
_:
97+
return "?"
98+
99+
100+
static func _camp_hex(c: GameConstants.Camp) -> String:
101+
match c:
102+
GameConstants.Camp.GREEN: return "#3d9e57"
103+
GameConstants.Camp.BLUE: return "#4073d9"
104+
GameConstants.Camp.RED: return "#d13838"
105+
GameConstants.Camp.YELLOW: return "#ebc72e"
106+
_: return "#aaaaaa"
107+
108+
109+
static func _piece_sym(pt: GameConstants.PieceType) -> String:
110+
match pt:
111+
GameConstants.PieceType.SOLDIER: return "○"
112+
GameConstants.PieceType.RAIDER: return "□"
113+
GameConstants.PieceType.HUNTER: return "△"
114+
GameConstants.PieceType.CRUISER: return "◇"
115+
GameConstants.PieceType.COMMANDO: return "●"
116+
GameConstants.PieceType.BOMBER: return "■"
117+
GameConstants.PieceType.FIGHTER: return "▲"
118+
GameConstants.PieceType.DESTROYER: return "♦"
119+
GameConstants.PieceType.HBOMB: return "H"
120+
_: return "?"
121+
122+
123+
static func _sector_bbcode(sector_id: String) -> String:
124+
var camp: GameConstants.Camp = BoardCatalog.camp_for_sector(sector_id)
125+
var cc: String = _camp_hex(camp)
126+
var short: String = BoardCatalog.sector_short_label(sector_id)
127+
if sector_id.begins_with("HQ_"):
128+
return "[color=%s]⚑[/color]" % cc
129+
if BoardCatalog.is_neutral(sector_id):
130+
return "[color=#8899bb]%s[/color]" % short
131+
return "[color=%s]%s[/color]" % [cc, short]
132+

godot/tools/compose_board_from_tiles.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
MOON_GREY = (120, 126, 142, 255)
3434
SUN_GREY = (100, 105, 120, 255)
3535
CAMP_TINT = {
36-
"Plains": (175, 60, 78), # → bordeaux Unity #8b3040
37-
"Ice": (68, 58, 158), # → violet Unity #4a3578
38-
"Jungle": (38, 108, 104), # → teal Unity #2a6e6a
39-
"Desert": (175, 138, 52), # → doré Unity #8a6a30
36+
"Plains": (232, 72, 98), # → bordeaux Unity #8b3040 (compensé multiply)
37+
"Ice": (118, 82, 245), # → violet Unity #4a3578 (compensé multiply)
38+
"Jungle": (60, 165, 158), # → teal Unity #2a6e6a (compensé multiply)
39+
"Desert": (230, 170, 62), # → doré Unity #8a6a30 (compensé multiply)
4040
}
4141

4242
# Bandes couloir (zones grises sur les bords extérieurs entre HQs).
@@ -48,10 +48,19 @@
4848

4949

5050
def _tint(img: Image.Image, rgb: tuple) -> Image.Image:
51+
"""Colorie l'image avec rgb en préservant la forme mais évitant le noir total.
52+
Luminance remappée sur [0.55, 1.0] : les pixels sombres gardent la teinte cible."""
5153
base = img.convert("RGBA")
52-
overlay = Image.new("RGBA", base.size, rgb + (255,))
53-
out = ImageChops.multiply(base, overlay)
54-
out.putalpha(base.split()[3])
54+
alpha = base.split()[3]
55+
from PIL import ImageOps
56+
gray = ImageOps.grayscale(base)
57+
# Remap luminance → [MIN_LUM, 1.0] pour éviter que multiply → noir
58+
MIN_LUM = 0.55
59+
scaled = gray.point(lambda p: int(255 * (MIN_LUM + (1.0 - MIN_LUM) * p / 255)))
60+
color_fill = Image.new("RGBA", base.size, rgb + (255,))
61+
lum_rgba = scaled.convert("RGBA")
62+
out = ImageChops.multiply(color_fill, lum_rgba)
63+
out.putalpha(alpha)
5564
return out
5665

5766

0 commit comments

Comments
 (0)