File size: 30,104 Bytes
68e302f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4998a93
 
 
 
 
68e302f
 
 
f975563
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68e302f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f975563
68e302f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f975563
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68e302f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
00108ff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MASSFRONT — Command. Conquer. Overwhelm.</title>
<meta name="description" content="A full-scale real-time strategy game built for phones. Four asymmetric factions, a commander you level through the match, and no compromises on the RTS.">
<meta property="og:title" content="MASSFRONT — Command. Conquer. Overwhelm.">
<meta property="og:description" content="A full-scale RTS built for phones. Four asymmetric factions. Play free in your browser, or install the Android build.">
<meta property="og:image" content="img/brand.png">
<meta property="og:type" content="website">
<meta name="theme-color" content="#04090f">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@700;900&family=Rajdhani:wght@500;600;700&display=swap" rel="stylesheet">
<style>
:root{
  --gold:#ffd66f; --cyan:#8be8ff; --ink:#04090f; --ink2:#070e17;
  --line:rgba(120,170,205,.18); --tx:#cfe0ec; --dim:#8fa9bd;
  --fT:'Orbitron','Segoe UI',sans-serif; --fB:'Rajdhani','Segoe UI',sans-serif;
  --wrap:1180px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{background:var(--ink);color:var(--tx);font-family:var(--fB);font-size:17px;line-height:1.65;
  -webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:var(--cyan);text-decoration:none}
img{max-width:100%;display:block}
.wrap{width:min(100% - 40px,var(--wrap));margin-inline:auto}
section{padding:86px 0;position:relative;scroll-margin-top:70px}
h2{font-family:var(--fT);font-size:clamp(24px,3.6vw,38px);font-weight:900;letter-spacing:.06em;
  color:#eaf7ff;text-transform:uppercase;line-height:1.15}
h3{font-family:var(--fT);font-size:16px;font-weight:700;letter-spacing:.11em;color:#eaf7ff;text-transform:uppercase}
.eyebrow{font-family:var(--fT);font-size:11px;font-weight:700;letter-spacing:.32em;color:var(--cyan);
  text-transform:uppercase;margin-bottom:14px}
.lede{font-size:clamp(17px,2vw,20px);color:var(--dim);max-width:74ch;margin-top:18px}

/* ---------- nav ---------- */
nav{position:sticky;top:0;z-index:50;background:rgba(4,9,15,.86);backdrop-filter:blur(12px);
  border-bottom:1px solid var(--line)}
nav .wrap{display:flex;align-items:center;gap:22px;height:62px}
.brandMark{font-family:var(--fT);font-weight:900;letter-spacing:.18em;color:#eaf7ff;font-size:15px;margin-right:auto}
.brandMark span{color:var(--gold)}
nav a.navlink{color:var(--dim);font-weight:600;letter-spacing:.04em;font-size:15px}
nav a.navlink:hover{color:var(--cyan)}
@media(max-width:820px){nav a.navlink{display:none}}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:10px;padding:15px 26px;border-radius:11px;
  font-family:var(--fT);font-size:14px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  border:1px solid transparent;cursor:pointer;transition:transform .12s,box-shadow .2s}
.btn:active{transform:scale(.97)}
.btn.gold{color:#1c1403;background:linear-gradient(180deg,#ffe9a3,#e8bd5c 45%,#c9973b 55%,#f2cf78);
  box-shadow:0 6px 24px rgba(255,200,80,.26)}
.btn.gold:hover{box-shadow:0 8px 32px rgba(255,200,80,.4)}
.btn.ghost{color:#dfeeff;background:rgba(12,22,34,.9);border-color:rgba(120,170,205,.34)}
.btn.ghost:hover{border-color:var(--cyan);color:#eaf7ff}

/* ---------- hero ---------- */
header.hero{position:relative;padding:72px 0 88px;text-align:center;overflow:hidden;
  background:
    radial-gradient(ellipse 70% 46% at 50% 24%,rgba(28,68,104,.5),transparent 70%),
    radial-gradient(ellipse 60% 40% at 50% 96%,rgba(96,58,14,.24),transparent 70%),
    var(--ink)}
header.hero::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(0deg,rgba(139,232,255,.028) 0 1px,transparent 1px 3px)}
.heroArt{width:min(88vw,760px);margin:0 auto;filter:drop-shadow(0 18px 44px rgba(0,0,0,.8))}
.heroTag{font-family:var(--fT);font-size:clamp(11px,1.7vw,14px);letter-spacing:.3em;color:var(--dim);
  margin-top:6px;text-transform:uppercase}
.heroSub{margin:26px auto 0;max-width:62ch;font-size:clamp(17px,2vw,20px);color:#b6cbdc}
.cta{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;margin-top:34px;position:relative;z-index:2}
.ctaNote{margin-top:16px;font-size:14px;color:#7f9db4}
.badges{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:26px;position:relative;z-index:2}
.badge{font-family:var(--fT);font-size:10px;letter-spacing:.14em;color:#9fc6e0;text-transform:uppercase;
  border:1px solid var(--line);border-radius:99px;padding:7px 14px;background:rgba(10,18,28,.7)}

/* ---------- hook ---------- */
.hook{background:linear-gradient(180deg,var(--ink),var(--ink2))}
.pitch{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:20px;margin-top:44px}
.card{border:1px solid var(--line);border-radius:14px;padding:24px;background:rgba(10,18,28,.6);
  transition:border-color .2s,transform .2s}
.card:hover{border-color:rgba(139,232,255,.4);transform:translateY(-3px)}
.card .k{font-family:var(--fT);font-size:26px;color:var(--gold);line-height:1}
.card h3{margin:14px 0 8px}
.card p{color:var(--dim);font-size:16px}

/* ---------- factions ---------- */
.fac{border:1px solid var(--line);border-radius:16px;overflow:hidden;margin-top:26px;
  background:rgba(8,14,22,.75);display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr)}
.fac:nth-child(even) .facArt{order:2}
.facArt{position:relative;min-height:290px;background-size:cover;background-position:center}
.facArt::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent 40%,rgba(8,14,22,.92))}
/* The art must fade toward whichever side the TEXT is on, and the cards
   alternate. Odd cards put the art on the left (fade right, the rule above);
   even cards put it on the right, so the fade has to flip with them. */
.fac:nth-child(even) .facArt::after{background:linear-gradient(90deg,rgba(8,14,22,.92),transparent 60%)}
.facBody{padding:30px 32px}
.facHead{display:flex;align-items:center;gap:14px}
.facHead img{width:56px;height:56px;border-radius:50%;object-fit:cover;border:2px solid var(--fc);
  box-shadow:0 0 14px color-mix(in srgb,var(--fc) 55%,transparent)}
.facNm{font-family:var(--fT);font-size:19px;font-weight:900;letter-spacing:.06em;color:#eaf7ff;text-transform:uppercase}
.facMotto{font-family:var(--fT);font-size:10px;letter-spacing:.2em;color:var(--fc);margin-top:4px}
.facLore{margin-top:16px;color:#b6cbdc;font-size:16px}
.facQuote{margin-top:14px;padding-left:14px;border-left:2px solid var(--fc);color:#dfe9f2;font-style:italic;font-size:16px}
.facQuote b{display:block;font-style:normal;font-size:12px;letter-spacing:.1em;color:var(--dim);
  text-transform:uppercase;margin-top:6px;font-family:var(--fT)}
.facRow{margin-top:18px;display:grid;gap:9px}
.facLine{display:grid;grid-template-columns:78px 1fr;gap:12px;align-items:baseline;font-size:15px}
.facLine b{font-family:var(--fT);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase}
.facLine.up b{color:#5be69f} .facLine.dn b{color:#ff9b87} .facLine.bn b{color:var(--gold)}
.facLine span{color:var(--dim)}
@media(max-width:900px){
  .fac{grid-template-columns:1fr}
  .fac:nth-child(even) .facArt{order:0}
  .facArt{min-height:190px}
  /* Both of these are needed: the nth-child rule above out-specifies a bare
     .facArt::after even from inside this media query, so without the second
     line every even card kept its horizontal fade on a phone. */
  .facArt::after,
  .fac:nth-child(even) .facArt::after{background:linear-gradient(180deg,transparent 30%,rgba(8,14,22,.95))}
  .facBody{padding:24px 22px}
}

/* ---------- gameplay gallery ---------- */
.shots{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:18px;margin-top:42px}
.shot{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:#060c14;
  transition:border-color .2s,transform .2s}
.shot:hover{border-color:rgba(139,232,255,.45);transform:translateY(-3px)}
.shot img{width:100%;height:auto;aspect-ratio:760/1660;object-fit:cover;object-position:top}
.shot .cap{padding:14px 16px 16px}
.shot .cap b{display:block;font-family:var(--fT);font-size:11.5px;letter-spacing:.11em;color:#eaf7ff;
  text-transform:uppercase}
.shot .cap p{margin-top:6px;color:var(--dim);font-size:14.5px;line-height:1.5}
.shotWide{display:grid;grid-template-columns:minmax(0,300px) minmax(0,1fr);gap:30px;align-items:center;
  margin-top:42px;border:1px solid var(--line);border-radius:16px;padding:26px;background:rgba(10,18,28,.55)}
.shotWide img{border-radius:12px;border:1px solid var(--line)}
.shotWide h3{font-size:17px}
.shotWide p{margin-top:12px;color:var(--dim);font-size:16px}
@media(max-width:760px){.shotWide{grid-template-columns:1fr;gap:20px}}

/* ---------- features ---------- */
.feat{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:18px;margin-top:40px}
.feat .card p{font-size:15.5px}

/* ---------- news + notes ---------- */
.split{display:grid;grid-template-columns:1fr 1fr;gap:26px;margin-top:40px}
@media(max-width:900px){.split{grid-template-columns:1fr}}
.panel{border:1px solid var(--line);border-radius:14px;background:rgba(8,14,22,.7);overflow:hidden}
.panelHead{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px}
.panelHead h3{font-size:13px}
.dot{width:8px;height:8px;border-radius:50%;background:#5be69f;box-shadow:0 0 8px rgba(91,230,159,.9);flex:0 0 auto}
.panelBody{max-height:520px;overflow-y:auto}
.item{padding:17px 20px;border-bottom:1px solid rgba(120,170,205,.1)}
.item:last-child{border-bottom:0}
.item b{display:block;font-family:var(--fT);font-size:12px;letter-spacing:.09em;color:#eaf7ff;text-transform:uppercase}
.item .ver{color:var(--gold)}
.item p{margin-top:7px;color:var(--dim);font-size:15.5px}
.item .when{font-family:var(--fT);font-size:9.5px;letter-spacing:.1em;color:#6f8ba0;margin-top:8px;display:block}

/* ---------- download ---------- */
.dl{background:linear-gradient(180deg,var(--ink2),#050b13);border-top:1px solid var(--line);
  border-bottom:1px solid var(--line)}
.dlGrid{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:38px}
@media(max-width:820px){.dlGrid{grid-template-columns:1fr}}
.dlCard{border:1px solid var(--line);border-radius:14px;padding:28px;background:rgba(10,18,28,.7);
  display:flex;flex-direction:column}
.dlCard .k{font-size:30px;line-height:1}
.dlCard h3{margin:14px 0 8px}
.dlCard p{color:var(--dim);font-size:15.5px;flex:1 1 auto}
.dlCard .btn{margin-top:20px;align-self:flex-start}
.small{font-size:13px;color:#71889b;margin-top:12px;word-break:break-all}

footer{padding:52px 0 60px;text-align:center;color:#6f8ba0;font-size:14.5px}
footer .brandMark{margin:0 0 14px;display:block;font-size:14px}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
</style>
</head>
<body>

<nav>
  <div class="wrap">
    <div class="brandMark">MASS<span>FRONT</span></div>
    <a class="navlink" href="#game">The Game</a>
    <a class="navlink" href="#screens">Screens</a>
    <a class="navlink" href="#factions">Factions</a>
    <a class="navlink" href="#features">Features</a>
    <a class="navlink" href="#news">News</a>
    <a class="navlink" href="#play">Play</a>
  </div>
</nav>

<header class="hero">
  <div class="wrap">
    <img class="heroArt" src="img/brand.png" alt="MASSFRONT — Command. Conquer. Overwhelm.">
    <p class="heroSub">A full-scale real-time strategy game built for a phone screen — base building, army composition,
      a commander you level through the match, and four factions that genuinely do not play alike.</p>
    <div class="cta">
      <a class="btn gold" href="https://creatorjd-massfront-playtest.static.hf.space/">&nbsp;Play free in browser</a>
      <a class="btn ghost" href="https://huggingface.co/datasets/CREATORJD/massfront-releases/resolve/main/MASSFRONT-install.apk?download=true">&nbsp;Download for Android</a>
    </div>
    <p class="ctaNote">No account required. Plays offline. Updates arrive over the air.</p>
    <div class="badges">
      <span class="badge">4 Factions</span>
      <span class="badge">4 Maps</span>
      <span class="badge">Up to 3 AI Commanders</span>
      <span class="badge">Adaptive Soundtrack</span>
      <span class="badge">Offline Play</span>
    </div>
  </div>
</header>

<section class="hook" id="game">
  <div class="wrap">
    <div class="eyebrow">What it is</div>
    <h2>A real RTS. On the device you actually have.</h2>
    <p class="lede">Most mobile strategy games quietly remove the strategy — timers instead of decisions, a build queue
      instead of a battle. MASSFRONT keeps the parts that make the genre worth playing and rebuilds the controls around
      a thumb, not a mouse.</p>

    <div class="pitch">
      <div class="card">
        <div class="k"></div>
        <h3>You command, not wait</h3>
        <p>Harvest mass and energy, raise a base, scout, tech up, and commit to a front. Everything resolves in
          real time. Nothing asks you to come back in four hours.</p>
      </div>
      <div class="card">
        <div class="k"></div>
        <h3>Your Commander is a unit</h3>
        <p>A hero on the field who earns XP, levels mid-match, and picks doctrine cards as they go. Orbital Blast,
          Repair Pulse, Combat Surge, Orbital Lance, EMP. Lose them and you feel it.</p>
      </div>
      <div class="card">
        <div class="k"></div>
        <h3>Asymmetry that means something</h3>
        <p>The Brood has no factories and no vehicles — it grows. The Coalition reshapes a fight before slower armies
          understand it. Each side wins differently and loses differently.</p>
      </div>
      <div class="card">
        <div class="k"></div>
        <h3>The battlefield fights back</h3>
        <p>Meteor storms, dust fronts, fault collapses. Derelict districts you can level for salvage. Terrain that
          deforms under bombardment and changes where armies can walk.</p>
      </div>
    </div>
  </div>
</section>

<section id="screens">
  <div class="wrap">
    <div class="eyebrow">Actual gameplay</div>
    <h2>This is the game running</h2>
    <p class="lede">Every shot below is a live match on a phone-sized screen — no mock-ups, no
      cropped-out interface. Full HUD, real armies, real base.</p>

    <div class="shotWide">
      <img src="img/shot-battle.jpg" alt="Two armies converging on open ground during a MASSFRONT match" loading="lazy">
      <div>
        <h3>Armies that meet in the middle</h3>
        <p>Two dozen units a side, converging on open ground, with the whole command interface still on
          screen — resources, objective clock, minimap, orders. The fight is the game, not a cutscene
          between menus.</p>
      </div>
    </div>

    <div class="shots">
      <figure class="shot">
        <img src="img/shot-base.jpg" alt="A player base with factories, reactors and defensive turrets" loading="lazy">
        <figcaption class="cap"><b>Build a real base</b>
          <p>Extractors, reactors, factories, research, turrets — laid out on ground you chose, wired
            into a power grid you have to defend.</p></figcaption>
      </figure>
      <figure class="shot">
        <img src="img/shot-close.jpg" alt="Close-range combat between armoured units" loading="lazy">
        <figcaption class="cap"><b>Zoom into the line</b>
          <p>Pinch from a company overview down to individual tanks trading fire. The camera never
            fights you for the information you need.</p></figcaption>
      </figure>
      <figure class="shot">
        <img src="img/shot-emp.jpg" alt="A commander ability firing on the battlefield" loading="lazy">
        <figcaption class="cap"><b>Commander abilities</b>
          <p>Orbital Blast, Repair Pulse, Combat Surge, Orbital Lance and a craftable EMP that freezes
            everything hostile around you.</p></figcaption>
      </figure>
      <figure class="shot">
        <img src="img/shot-production.jpg" alt="The unit production menu open on a factory" loading="lazy">
        <figcaption class="cap"><b>Production that reads</b>
          <p>Tap a factory, pick a role, queue it. Infantry, vehicles, anti-tank, artillery, air, naval —
            each with its counters spelled out.</p></figcaption>
      </figure>
      <figure class="shot">
        <img src="img/shot-warroom.jpg" alt="The War Room mode select screen" loading="lazy">
        <figcaption class="cap"><b>The War Room</b>
          <p>One door to every operation: Training, Standard skirmish, and the Hosted, MMO and Campaign
            modes still being built.</p></figcaption>
      </figure>
      <figure class="shot">
        <img src="img/shot-menu.jpg" alt="The MASSFRONT main menu with commander profile" loading="lazy">
        <figcaption class="cap"><b>A career worth keeping</b>
          <p>Rank up, wear a commander from the roster, earn callsign titles and portrait frames. All of
            it saved on your device.</p></figcaption>
      </figure>
    </div>
  </div>
</section>

<section id="factions">
  <div class="wrap">
    <div class="eyebrow">Choose a doctrine</div>
    <h2>Four ways to take a planet</h2>
    <p class="lede">Halcyon Reach is not empty and it is not yours. Every faction has a different answer to that —
      a different economy, a different army, and a different idea of what victory looks like.</p>

    <div class="fac" style="--fc:#5db6ff">
      <div class="facArt" style="background-image:url(img/fac-nova.jpg)"></div>
      <div class="facBody">
        <div class="facHead">
          <img src="img/cdr-nova.jpg" alt="Captain Elara Kai">
          <div><div class="facNm">Terran Frontline Command</div><div class="facMotto">Discipline. Technology. Unity.</div></div>
        </div>
        <p class="facLore">A combined-arms expedition built around hardened positions, precision fire and dependable
          battlefield logistics. It wins by seeing first, building a line, then advancing that line without breaking it.</p>
        <blockquote class="facQuote">“For peace. For the people. For tomorrow.”<b>Captain Elara Kai</b></blockquote>
        <div class="facRow">
          <div class="facLine up"><b>Strong</b><span>Long-range fire · durable defence · flexible combined arms</span></div>
          <div class="facLine dn"><b>Weak</b><span>Slower deployment · costly upgrades · flanking and EMP pressure</span></div>
          <div class="facLine bn"><b>Bonus</b><span>Advanced Engineering — units build faster and cost less</span></div>
        </div>
      </div>
    </div>

    <div class="fac" style="--fc:#ff6b58">
      <div class="facArt" style="background-image:url(img/fac-ascendancy.jpg)"></div>
      <div class="facBody">
        <div class="facHead">
          <img src="img/cdr-ascendancy.jpg" alt="Lord Darion Vex">
          <div><div class="facNm">Crimson Dominion</div><div class="facMotto">Strength. Authority. Conquest.</div></div>
        </div>
        <p class="facLore">An authoritarian war machine of armoured offensives, suppression batteries and siege engines.
          It wins by forcing one decisive front and breaking it with overwhelming burst damage.</p>
        <blockquote class="facQuote">“The weak are fuel. The strong ascend.”<b>Lord Darion Vex</b></blockquote>
        <div class="facRow">
          <div class="facLine up"><b>Strong</b><span>Heavy frontal assaults · anti-armour · siege and morale pressure</span></div>
          <div class="facLine dn"><b>Weak</b><span>Predictable lanes · expensive elites · mobile harassment</span></div>
          <div class="facLine bn"><b>Bonus</b><span>Martial Doctrine — units hit harder the longer they stay in combat</span></div>
        </div>
      </div>
    </div>

    <div class="fac" style="--fc:#8ce85a">
      <div class="facArt" style="background-image:url(img/fac-syndicate.jpg)"></div>
      <div class="facBody">
        <div class="facHead">
          <img src="img/cdr-syndicate.jpg" alt="Broker Lys Renn">
          <div><div class="facNm">Syndicate Coalition</div><div class="facMotto">Adapt. Profit. Survive.</div></div>
        </div>
        <p class="facLore">Autonomous constructs, predictive targeting and the most advanced energy weapons on Halcyon.
          Its machine cadres reshape an engagement before slower armies understand the threat.</p>
        <blockquote class="facQuote">“Information is power. Profit is freedom.”<b>Broker Lys Renn</b></blockquote>
        <div class="facRow">
          <div class="facLine up"><b>Strong</b><span>Precision energy weapons · drones · shields · area control</span></div>
          <div class="facLine dn"><b>Weak</b><span>Low hull strength · setup time · melee pressure · EMP</span></div>
          <div class="facLine bn"><b>Bonus</b><span>Black Market — extra resources from captured deposits and structures</span></div>
        </div>
      </div>
    </div>

    <div class="fac" style="--fc:#b978ff">
      <div class="facArt" style="background-image:url(img/fac-horde.jpg)"></div>
      <div class="facBody">
        <div class="facHead">
          <img src="img/cdr-horde.jpg" alt="The Brood Sovereign">
          <div><div class="facNm">Brood Swarm</div><div class="facMotto">Evolve. Assimilate. Endure.</div></div>
        </div>
        <p class="facLore">A wholly biological hive — no vehicles, no factories, no machine weapons. It grows organisms,
          spreads living territory, mutates under pressure and overwhelms defences through relentless numbers.</p>
        <blockquote class="facQuote">“It does not negotiate. It arrives.”<b>The Brood Sovereign</b></blockquote>
        <div class="facRow">
          <div class="facLine up"><b>Strong</b><span>Critical mass · anti-light claws · structure rending · casters</span></div>
          <div class="facLine dn"><b>Weak</b><span>Area fire · long-range siege · detection · exposed growth organs</span></div>
          <div class="facLine bn"><b>Bonus</b><span>Endless Spawn — cheaper broods, faster hatcheries, packs that grow as they feed</span></div>
        </div>
      </div>
    </div>
  </div>
</section>

<section class="hook" id="features">
  <div class="wrap">
    <div class="eyebrow">Under the hood</div>
    <h2>Systems, not menus</h2>
    <div class="feat">
      <div class="card"><h3>Platoons &amp; orders</h3><p>Group units into platoons, set patrol routes, hold ground,
        and give formation moves that arrive as a column rather than a pile.</p></div>
      <div class="card"><h3>Research &amp; development</h3><p>A real tech tree — ballistics, armour, logistics — plus
        craftable modules that change what your Commander can do.</p></div>
      <div class="card"><h3>Air &amp; transport</h3><p>Aircraft for rapid response, and the Atlas Skycrane to airlift
        infantry, constructors and light vehicles across terrain that would take minutes on foot.</p></div>
      <div class="card"><h3>Wildcards</h3><p>Optional match modifiers that change the rules — meteor seasons, blitz
        timers, iron enemies — for extra XP and cores.</p></div>
      <div class="card"><h3>Adaptive soundtrack</h3><p>The music follows combat intensity with hysteresis, so it
        escalates with the battle instead of flapping around a threshold.</p></div>
      <div class="card"><h3>Command radio</h3><p>Unit acknowledgements are recorded voice lines — one voice per
        faction, run through a real comms filter, not a text-to-speech reader.</p></div>
      <div class="card"><h3>Training operation</h3><p>A protected live-fire drop that teaches the full command loop
        with no early rush. Nineteen objectives, and your progress is saved.</p></div>
      <div class="card"><h3>Play offline</h3><p>No account needed, no connection required. Sign in only if you want a
        cloud backup, and export a save file to move a career between phones.</p></div>
    </div>
  </div>
</section>

<section id="news">
  <div class="wrap">
    <div class="eyebrow">Live channel</div>
    <h2>News &amp; update notes</h2>
    <p class="lede">MASSFRONT updates over the air — the game checks on launch and patches itself, so a download is
      only ever needed once.</p>
    <div class="split">
      <div class="panel">
        <div class="panelHead"><span class="dot"></span><h3>News</h3></div>
        <div class="panelBody" id="newsBody">
          <div class="item">
            <b>War Room is open</b>
            <p>PLAY is now the War Room: Standard skirmish, Training, and a look at the Hosted Match, MMO and Campaign
              modes still in development.</p>
          </div>
          <div class="item">
            <b>Commanders and unlocks</b>
            <p>Your commander is a character now. Pick from the roster in Profile, with callsign titles and portrait
              frames that unlock as your account ranks up.</p>
          </div>
          <div class="item">
            <b>Radio voices</b>
            <p>Unit acknowledgements are recorded radio lines, one voice per faction, over a real comms filter. They
              arrive as an optional 1.9 MB pack.</p>
          </div>
        </div>
      </div>

      <div class="panel">
        <div class="panelHead"><span class="dot" style="background:var(--gold);box-shadow:0 0 8px rgba(255,214,111,.9)"></span><h3>Update notes</h3></div>
        <div class="panelBody" id="notesBody">
          <div class="item"><b class="ver">v1.32.25</b><p>The game version block is now a status dot in the header — it
            checks for updates by itself when you reach the menu, amber while checking or when one is waiting, green when
            you are current. Tap it for release notes, install or rollback. The Inbox gained an update log and a
            newsletter section.</p></div>
          <div class="item"><b class="ver">v1.32.24</b><p>New commander header: profile icon with your level, resources
            underneath, and proper clearance from the phone's status bar. The EMP Charge module now works — it stuns
            enemy units and structures around your Commander. Combat Stims no longer eat part of any damage research
            completed while they are active.</p></div>
          <div class="item"><b class="ver">v1.32.23</b><p>Fixes a freeze when your Commander got stuck on crater
            terrain. Atlas Skycrane now appears with the aircraft in the Airfield. Menu music no longer loops
            back-to-back. Long-range turrets now actually shoot at their stated range, and the base-attack alarm works
            in every match, not just the first.</p></div>
          <div class="item"><b class="ver">v1.32.22</b><p>New Inbox on the menu — every transmission in one place with
            an unread badge, plus where friend requests and messages will land.</p></div>
          <div class="item"><b class="ver">v1.32.21</b><p>Accounts gained a username so friends can find you, a 13+ age
            check at sign-up, and Delete Account in Profile.</p></div>
          <div class="item"><b class="ver">v1.32.20</b><p>Your commander became a character — the MASSFRONT roster in
            Profile, with callsign titles and portrait frames unlocked by account rank. Recorded radio voices replaced
            the phone's text reader.</p></div>
          <div class="item"><b class="ver">v1.32.19</b><p>PLAY became the WAR ROOM. Account moved under Profile, sign-in
            offered at launch, and the commander rank moved to Profile with a clean badge in its place.</p></div>
        </div>
      </div>
    </div>
  </div>
</section>

<section class="dl" id="play">
  <div class="wrap">
    <div class="eyebrow">Get it</div>
    <h2>Two ways to play</h2>
    <div class="dlGrid">
      <div class="dlCard">
        <div class="k">🌐</div>
        <h3>Play in your browser</h3>
        <p>The full game, no install. Works on desktop and mobile browsers — best in portrait on a phone. Nothing to
          sign up for.</p>
        <a class="btn gold" href="https://creatorjd-massfront-playtest.static.hf.space/">&nbsp;Launch web build</a>
      </div>
      <div class="dlCard">
        <div class="k">🤖</div>
        <h3>Install on Android</h3>
        <p>The native build, with offline play and over-the-air updates. You may need to allow installs from unknown
          sources — this is a direct download, not a store listing.</p>
        <a class="btn ghost" href="https://huggingface.co/datasets/CREATORJD/massfront-releases/resolve/main/MASSFRONT-install.apk?download=true">&nbsp;Download APK (46.6 MB)</a>
      </div>
    </div>
  </div>
</section>

<footer>
  <div class="wrap">
    <span class="brandMark">MASS<span>FRONT</span></span>
    <p>Command. Conquer. Overwhelm. · Halcyon Reach is not empty and it is not yours.</p>
    <p style="margin-top:10px">MMO and Campaign modes are in development. Hosted matches are next.</p>
  </div>
</footer>

<script>
/* Pull the same news feed the in-game Inbox reads, so the site and the game can
   never disagree. Static fallback above stays if the fetch fails or is blocked. */
(function(){
  var URL='https://huggingface.co/datasets/CREATORJD/massfront-releases/resolve/main/news.json';
  fetch(URL,{cache:'no-store'}).then(function(r){return r.ok?r.json():null;}).then(function(j){
    if(!j||!Array.isArray(j.items)||!j.items.length) return;
    var esc=function(s){return String(s==null?'':s).replace(/[&<>]/g,function(c){
      return {'&':'&amp;','<':'&lt;','>':'&gt;'}[c];});};
    document.getElementById('newsBody').innerHTML=j.items.map(function(n){
      return '<div class="item"><b>'+esc(n.title||'Briefing')+'</b><p>'+esc(n.body||'')+'</p></div>';
    }).join('');
  }).catch(function(){});
})();
</script>
</body>
</html>