Skip to content

feat(intro): Add short Intro Logo for The Super Hackers team#2267

Open
xezon wants to merge 6 commits intoTheSuperHackers:mainfrom
xezon:xezon/add-new-intro
Open

feat(intro): Add short Intro Logo for The Super Hackers team#2267
xezon wants to merge 6 commits intoTheSuperHackers:mainfrom
xezon:xezon/add-new-intro

Conversation

@xezon
Copy link
Copy Markdown

@xezon xezon commented Feb 7, 2026

Merge with Rebase

This change has 5 commits:

  1. Move intro related code to new file and class
  2. Simplify the intro state machine to make it easier to modify and extend
  3. Remove the non functional copyright string and simplify the EA logo movie code. This also shortens the effective EA logo duration by 3 to 5 seconds.
  4. Remove the superfluous legal page from intro sequence, which would have lasted 4 seconds after Sizzle video but was practically never visible except if the mem pass would have failed (relevant for 2000 era computers). I think the condition was actually meant to be the inverse...
  5. Add new intro screen for The Super Hacker team

Old Intro Sequence

  1. EA Logo, 3 seconds, non skippable
  2. Black Screen, 3-5 seconds (*1), non skippable
  3. Sizzle Video, skippable
  4. Legal Page, 4 seconds, practically never shown
  5. Shell Map load screen

(*1) I did not measure how long the black screen was. According to code somewhere between 3 to 5 seconds.

New Intro Sequence

  1. EA Logo, 3 seconds, non skippable
  2. Black Screen, 800 milliseconds, non skippable
  3. The Super Hackers Logo, 3 seconds, non skippable
  4. Black Screen, 1 second, non skippable
  5. Sizzle Video, skippable
  6. Shell Map load screen
image

TODO

  • Replicate in Generals
  • Add pull id to commit titles
  • Verify each commit compiles individually

@xezon xezon added Art Is art related Enhancement Is new feature or request Minor Severity: Minor < Major < Critical < Blocker Gen Relates to Generals ZH Relates to Zero Hour Refactor Edits the code with insignificant behavior changes, is never user facing labels Feb 7, 2026
@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Feb 7, 2026

Greptile Summary

This PR extracts the intro sequence into a new Intro class and state machine, removes the defunct legal-page state, and adds a new 3-second The Super Hackers splash screen (text art + image + website, with fade-in/fade-out) between the EA logo and sizzle video. Previously-reported regressions (150-second wait overflow, enterNextState visibility, IntroState_Start stall) are resolved.

  • One remaining concern in drawDisplayEntities(): the fade-out condition timeGetTime() + fadeOutMs > m_waitUntilMs performs unsigned addition that can overflow, and is permanently true once the timer expires; the arithmetic should be hardened before the pattern spreads.

Confidence Score: 4/5

Safe to merge; the one remaining finding is a fragile but practically harmless unsigned arithmetic edge case in the fade-out guard.

All previously-reported P0/P1 issues are fixed. The remaining comment is a borderline P1 (unsigned underflow on the fade timer) whose practical impact is negligible because the draw guard prevents it from affecting visible output, but the arithmetic should be corrected before the pattern spreads.

Core/GameEngine/Source/GameClient/Intro.cpp — the fade-out timer condition around line 272.

Important Files Changed

Filename Overview
Core/GameEngine/Include/GameClient/Intro.h New header for the Intro class; uses #pragma once, correct copyright for a new community file, all methods correctly placed in public/private sections.
Core/GameEngine/Source/GameClient/Intro.cpp Core intro state machine; previously-reported bugs fixed. One remaining concern: the fade-out timer condition may underflow due to unsigned arithmetic when the wait has already expired.
GeneralsMD/Code/GameEngine/Include/GameClient/GameClient.h Added Intro forward declaration and m_intro member; straightforward integration.
GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp Intro lifecycle (construction, update, draw, deletion) wired correctly into the GameClient loop.
GeneralsMD/Code/GameEngine/Source/Common/CommandLine.cpp Headless/replay/nologo command-line paths correctly disable both m_playIntro and m_playSizzle.
GeneralsMD/Code/GameEngine/Include/Common/GlobalData.h m_afterIntro removed, m_playIntro/m_playSizzle/m_allowExitOutOfMovies retained; no issues.
Core/GameEngine/CMakeLists.txt Intro.h and Intro.cpp added to the shared core engine build sources correctly.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    Start([IntroState_Start]) --> |enterNextState| EA[IntroState_EALogoMovie\ndoEALogoMovie\nplayMovie EALogoMovie]
    EA --> |movie ends| TSHWait[IntroState_TheSuperHackersWait\ndoAsyncWait 800ms]
    TSHWait --> |wait expires| TSH[IntroState_TheSuperHackers\ndoTheSuperHackers\ndoAsyncWait 3000ms]
    TSH --> |wait expires| SizzleWait[IntroState_SizzleMovieWait\ndoAsyncWait 1000ms]
    SizzleWait --> |wait expires| Sizzle[IntroState_SizzleMovie\ndoSizzleMovie\nplayMovie Sizzle]
    Sizzle --> |movie ends| Done[IntroState_Done\ndoPostIntro\nm_breakTheMovie=TRUE]
    Done --> Shell([Shell Map loads])
    style TSH fill:#2d6a4f,color:#fff
    style Done fill:#444,color:#fff
Loading
Prompt To Fix All With AI
This is a comment left during a code review.
Path: Core/GameEngine/Source/GameClient/Intro.cpp
Line: 272

Comment:
**Fade-out check fires indefinitely after wait expires**

`timeGetTime() + fadeOutMs > m_waitUntilMs` is always true once the timer has expired (i.e. once `timeGetTime() > m_waitUntilMs`), so the fade-out branch will keep running on every subsequent draw call. The condition is semantically inverted from what you probably want: "start fade-out when there are `fadeOutMs` milliseconds *remaining*". Additionally, `m_waitUntilMs` and `timeGetTime()` are both `UnsignedInt`, so `timeGetTime() + fadeOutMs` can overflow. The correct formulation checks remaining time via subtraction:

```suggestion
	if (m_waitUntilMs - timeGetTime() < (UnsignedInt)fadeOutMs)
```

Note: when `timeGetTime() > m_waitUntilMs` the subtraction wraps, so you may also want to guard with an explicit expiry check first.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (11): Last reviewed commit: "fixup! feat(intro): Add short Intro Logo..." | Re-trigger Greptile

Copy link
Copy Markdown

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

9 files reviewed, 4 comments

Edit Code Review Agent Settings | Greptile

Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Include/GameClient/Intro.h
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Feb 7, 2026

Additional Comments (1)

GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp
Intro can block startup

GameClient::update() only shows the shell (TheShell->showShellMap/showShell) after m_intro->isDone(). With the new Intro implementation, if the global flags disable both intro and sizzle (m_playIntro==false and m_playSizzle==false) and m_afterIntro is not pre-set, Intro never reaches Done (see IntroState_Start handling), so the game can get stuck in the intro phase and never show the shell. This previously worked because GameEngine::init() forced m_afterIntro = TRUE when m_playIntro was false.

Fix by making Intro immediately become done when there are no enabled states, or by preserving the old m_afterIntro initialization behavior.

Prompt To Fix With AI
This is a comment left during a code review.
Path: GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp
Line: 514:531

Comment:
**Intro can block startup**

`GameClient::update()` only shows the shell (`TheShell->showShellMap/showShell`) after `m_intro->isDone()`. With the new `Intro` implementation, if the global flags disable both intro and sizzle (`m_playIntro==false` and `m_playSizzle==false`) and `m_afterIntro` is not pre-set, `Intro` never reaches `Done` (see `IntroState_Start` handling), so the game can get stuck in the intro phase and never show the shell. This previously worked because `GameEngine::init()` forced `m_afterIntro = TRUE` when `m_playIntro` was false.

Fix by making `Intro` immediately become done when there are no enabled states, or by preserving the old `m_afterIntro` initialization behavior.

How can I resolve this? If you propose a fix, please make it concise.

@xezon xezon force-pushed the xezon/add-new-intro branch from 999721b to 0f278e6 Compare February 7, 2026 14:15
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp Outdated
@xezon xezon force-pushed the xezon/add-new-intro branch from 0f278e6 to 1a738f7 Compare February 7, 2026 16:19
Copy link
Copy Markdown

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

Comment thread Core/GameEngine/Include/GameClient/Intro.h
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
@helmutbuhler
Copy link
Copy Markdown

Wouldn't it be more appropriate to show the Superhackers stuff in the credits menu? As is this would imply that the whole game is made by us. I don't think it would be fair to show our names more prominently than the original developers.

@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 7, 2026

Wouldn't it be more appropriate to show the Superhackers stuff in the credits menu? As is this would imply that the whole game is made by us. I don't think it would be fair to show our names more prominently than the original developers.

Maybe remove all user names from this Intro and just show the Team name + url?

We can also clarify "Edited by ..."

@helmutbuhler
Copy link
Copy Markdown

Wouldn't it be more appropriate to show the Superhackers stuff in the credits menu? As is this would imply that the whole game is made by us. I don't think it would be fair to show our names more prominently than the original developers.

Maybe remove all user names from this Intro and just show the Team name + url?

We can also clarify "Edited by ..."

I wouldn't add anything to the intro. I don't think it's necessary to remind the player every time the game starts who made the patch. Maybe just add a tiny note on the shellmap screen below the gamename "patched by Superhackers" or something like that.

It's nice though that the 3-5 seconds black screen is removed here!

@Caball009
Copy link
Copy Markdown

Caball009 commented Feb 8, 2026

I didn't even know what the 'black screen' was when I saw this PR, because I have renamed the files for the EA logo and sizzle and I don't see it. This makes the game launch faster, and saves me 5+ seconds every time I launch the game. I strongly dislike changing anything that would unnecessarily increase the launch time for me as developer. I'm ok with it if I can skip it with some command line.

That said, I like the new intro.

@LegionnaireG
Copy link
Copy Markdown

LegionnaireG commented Feb 8, 2026

I don't think people will understand what it means if the intro screen is this plain. On the intro, maybe add 3 to 5 sentences with the key achievements of TheSuperHackers. Maybe something like:

  We've patched up the game to bring you:
  - Improving game stability
  - Unlocked 60+ FPS for single player
  - Significant reduction in mismatches for multiplayer
  - Higher graphics preset
  - Vulnerability fixes

@tintinhamans
Copy link
Copy Markdown

I don't think people will understand what it means if the intro screen is this plain. On the intro, maybe add 3 to 5 sentences with the key achievements of TheSuperHackers. Maybe something like:

  We've patched up the game to bring you:
  - Improving game stability
  - Unlocked 60+ FPS for single player
  - Significant reduction in mismatches for multiplayer
  - Higher graphics preset
  - Vulnerability fixes

I feel like adding too much text won't really be very useful given the fact that it's only shown for 3 seconds.

@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 8, 2026

I feel like adding too much text won't really be very useful given the fact that it's only shown for 3 seconds.

I agree with this sentiment.

What we can add is a "Improved by" on top, to clarify that this Author has improved the game. This is very simple and broad.

@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 9, 2026

When this is merged I will make a follow up to skip the entire intro sequence with a single ESC press. This will alleviate any waiting pains for impatient users.

@xezon xezon force-pushed the xezon/add-new-intro branch from 1a738f7 to 29b1ce7 Compare February 11, 2026 19:46
@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 11, 2026

Improvements applied according to feedbacks:

  • Removed all individual contributor names (to be shown in Credits Menu instead)
  • Replaced github url with domain name
  • Added pretext to clarify that we did not built the game, but improved it
image

Copy link
Copy Markdown

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

12 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Feb 11, 2026

Additional Comments (1)

GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp
Missing cleanup of m_intro in destructor - potential memory leak if GameClient is destroyed before intro completes.

	delete m_intro;
	m_intro = nullptr;
Prompt To Fix With AI
This is a comment left during a code review.
Path: GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp
Line: 119:119

Comment:
Missing cleanup of `m_intro` in destructor - potential memory leak if `GameClient` is destroyed before intro completes.

```suggestion
	delete m_intro;
	m_intro = nullptr;
```

How can I resolve this? If you propose a fix, please make it concise.

@xezon xezon force-pushed the xezon/add-new-intro branch from 29b1ce7 to 9c82551 Compare February 11, 2026 19:55
@xezon xezon requested a review from tintinhamans February 11, 2026 19:58
Copy link
Copy Markdown

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

12 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Comment thread Core/GameEngine/Source/GameClient/Intro.cpp Outdated
@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 11, 2026

Maybe text can be made a bit bigger.

@fbraz3
Copy link
Copy Markdown

fbraz3 commented Feb 13, 2026

A suggestion: the credits screen would display all contributors names.

Something like:

# TheSuperHackers Team

Name 1 - Role
Name 2 - Role
Name 3 - Role
......

# Individual Contributors

Name 4 - 100 commits
Name 5 - 95 commits
.....

# EA games
......
......
......

The git summary command from Git Extras can be used to generate the individual contributors report and add it dinamically on build time.
https://github.com/tj/git-extras/blob/main/Commands.md#git-summary

@xezon xezon force-pushed the xezon/add-new-intro branch from dc44ab3 to 0f958d9 Compare February 22, 2026 09:45
@xezon
Copy link
Copy Markdown
Author

xezon commented Feb 22, 2026

Text was made bigger. And font scaling was made strict with factor 1.0. It will always look the same on any resolution, independent of Language.ini setups.

image

@xezon xezon force-pushed the xezon/add-new-intro branch from 0f958d9 to 12e53a2 Compare February 24, 2026 21:50
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp Outdated
@xezon xezon force-pushed the xezon/add-new-intro branch from 12e53a2 to 832f3d8 Compare March 9, 2026 19:59
Comment thread Core/GameEngine/Include/GameClient/Intro.h Outdated
@Mauller
Copy link
Copy Markdown

Mauller commented Mar 10, 2026

How about some old school ASCII text? Like the Atari days.

  _______ _             _____                       _    _            _                 
 |__   __| |           / ____|                     | |  | |          | |                
    | |  | |__   ___  | (___  _   _ _ __   ___ _ __| |__| | __ _  ___| | _____ _ __ ___ 
    | |  | '_ \ / _ \  \___ \| | | | '_ \ / _ \ '__|  __  |/ _` |/ __| |/ / _ \ '__/ __|
    | |  | | | |  __/  ____) | |_| | |_) |  __/ |  | |  | | (_| | (__|   <  __/ |  \__ \
    |_|  |_| |_|\___| |_____/ \__,_| .__/ \___|_|  |_|  |_|\__,_|\___|_|\_\___|_|  |___/
                                   | |                                                  
                                   |_|                                                  

@xezon xezon force-pushed the xezon/add-new-intro branch from 832f3d8 to f3a985c Compare March 22, 2026 10:14
@xezon
Copy link
Copy Markdown
Author

xezon commented Mar 22, 2026

How about some old school ASCII text?

Maybe is a bit difficult to read. Also makes it look like hackware.

Rebased.

@xezon xezon requested a review from tintinhamans March 25, 2026 18:44
@DevGeniusCode
Copy link
Copy Markdown

I've checked this locally and it rebases cleanly onto the current main branch with no conflicts. LGTM for merging

(I think the pretext of Game fixed and improved by is better)

Additionally, I wonder if instead of hardcoding this into the game engine, wouldn't it be better to create an external file like the original game intro EA_LOGO.BIK

@xezon
Copy link
Copy Markdown
Author

xezon commented Apr 18, 2026

Game fixed and improved by. I am convinced we cannot claim this. Because "Game fixed" implies that there will be no big bugs in the game: no crashes, no mismatches. As soon as a user has a crash or any other bug, the intro title would be a lie. Game improved by is a much more truthful title for it.

We cannot put a BIK video because it would not work in forks of this project and requires a data patch. The intro is intentionally hard coded, because it is not meant to be changed, other than the localization.

@xezon xezon force-pushed the xezon/add-new-intro branch from f3a985c to bf25fd5 Compare April 18, 2026 17:42
@xezon
Copy link
Copy Markdown
Author

xezon commented Apr 18, 2026

Rebased and ASCII art added for retro look

shot_20260418_194121_2

Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Art Is art related Enhancement Is new feature or request Gen Relates to Generals Minor Severity: Minor < Major < Critical < Blocker Refactor Edits the code with insignificant behavior changes, is never user facing ZH Relates to Zero Hour

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants