Skip to content

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

Merged
xezon merged 5 commits into
TheSuperHackers:mainfrom
xezon:xezon/add-new-intro
Jul 15, 2026
Merged

feat(intro): Add short Intro Logo for The Super Hackers team#2267
xezon merged 5 commits into
TheSuperHackers:mainfrom
xezon:xezon/add-new-intro

Conversation

@xezon

@xezon xezon commented Feb 7, 2026

Copy link
Copy Markdown

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

greptile-apps Bot commented Feb 7, 2026

Copy link
Copy Markdown

Greptile Summary

This PR replaces the startup intro flow with a reusable state machine. The main changes are:

  • Adds the shared Intro class and build wiring.
  • Replaces the legacy logo, wait, and legal-page flow.
  • Integrates intro updates and rendering in Generals and Zero Hour.
  • Removes the obsolete m_afterIntro state.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
Core/GameEngine/Source/GameClient/Intro.cpp Adds the intro state machine, custom logo rendering, waits, and movie transitions.
Generals/Code/GameEngine/Source/GameClient/GameClient.cpp Owns the Intro instance and switches to the shell after completion.
GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp Mirrors the Intro lifecycle and shell handoff for Zero Hour.
Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp Invokes GameClient drawing during the W3D render pass.
GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp Mirrors the W3D intro drawing integration for Zero Hour.

Reviews (17): Last reviewed commit: "feat(intro): Add short Intro Logo for Th..." | Re-trigger Greptile

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

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

greptile-apps Bot commented Feb 7, 2026

Copy link
Copy Markdown
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

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

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

xezon commented Feb 7, 2026

Copy link
Copy Markdown
Author

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

Caball009 commented Feb 8, 2026

Copy link
Copy Markdown

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

LegionnaireG commented Feb 8, 2026

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

@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

xezon commented Feb 8, 2026

Copy link
Copy Markdown
Author

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

xezon commented Feb 9, 2026

Copy link
Copy Markdown
Author

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

xezon commented Feb 11, 2026

Copy link
Copy Markdown
Author

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

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

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

greptile-apps Bot commented Feb 11, 2026

Copy link
Copy Markdown
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

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

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

xezon commented Feb 11, 2026

Copy link
Copy Markdown
Author

Maybe text can be made a bit bigger.

@fbraz3

fbraz3 commented Feb 13, 2026

Copy link
Copy Markdown

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 requested a review from bobtista May 31, 2026 16:21
@githubawn

Copy link
Copy Markdown
image

It looks even stranger now.

@xezon xezon force-pushed the xezon/add-new-intro branch from 2679b54 to 7702190 Compare July 10, 2026 20:48
@xezon

xezon commented Jul 10, 2026

Copy link
Copy Markdown
Author

Rebased on main.

ASCII symbols removed. Normal text readded. Author in UPPER CASE. Web url removed for simplicity.

Looks clean.

shot_20260710_224403_1

Comment thread Core/GameEngine/Source/GameClient/Intro.cpp Outdated
@xezon xezon force-pushed the xezon/add-new-intro branch from 7702190 to 5e10a09 Compare July 10, 2026 20:52
Comment thread GeneralsMD/Code/GameEngine/Source/GameClient/GameClient.cpp Outdated
, sizeY(10)
, centerOffsetY(0)
{}
~DisplayEntity();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

DisplayEntity frees displayString in its destructor but has implicit copy ctor/assignment and lives in a std::vector, maybe free the strings in a ~Intro loop instead? I think this would only be an issue if someone appends a second credits screen though

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yes that is not so elegant. It would be solved by making the raw pointer a unique_ptr with c++11. I added a comment for now.

@bobtista

Copy link
Copy Markdown

Looks beautiful! I found that it crashes if I exit/alt f4 during our credit screen, left a couple of comments.

Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
Comment thread Core/GameEngine/Source/GameClient/Intro.cpp
@xezon xezon force-pushed the xezon/add-new-intro branch from ceb12df to 4810e26 Compare July 13, 2026 17:26
@xezon xezon requested review from Skyaero42 and bobtista July 14, 2026 07:23
@bobtista

Copy link
Copy Markdown

Now looks good to me - replicate to Generals then I'd merge

@Skyaero42 Skyaero42 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Looks good

@xezon xezon force-pushed the xezon/add-new-intro branch from 4810e26 to c8e1367 Compare July 15, 2026 17:54
@xezon

xezon commented Jul 15, 2026

Copy link
Copy Markdown
Author

Replicated in Generals with conflicts.

$ git diff fa27613249c3cd2747219a76a2d3a6765748dded..50ff3cf9ccf2f7a194d0d9f9b5cb99ce446cb2bb > changes.patch

$ git apply -p2 --directory=Generals --reject --whitespace=fix changes.patch
Checking patch Generals/GameEngine/CMakeLists.txt...
error: Generals/GameEngine/CMakeLists.txt: No such file or directory
Checking patch Generals/GameEngine/Include/GameClient/Intro.h...
Checking patch Generals/GameEngine/Source/GameClient/Intro.cpp...
Checking patch Generals/Code/GameEngine/Include/GameClient/GameClient.h...
Hunk #2 succeeded at 174 (offset -6 lines).
Checking patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp...
error: while searching for:
#include "Common/ThingFactory.h"
#include "Common/ThingTemplate.h"
#include "Common/Xfer.h"
#include "Common/GameLOD.h"
#include "GameClient/Anim2D.h"
#include "GameClient/CampaignManager.h"
#include "GameClient/ChallengeGenerals.h"

error: patch failed: Generals/Code/GameEngine/Source/GameClient/GameClient.cpp:43
Hunk #3 succeeded at 78 (offset -1 lines).
Hunk #4 succeeded at 107 (offset -1 lines).
Hunk #5 succeeded at 152 (offset -1 lines).
error: while searching for:
                TheSnowManager->setName("TheSnowManager");
        }

#ifdef PERF_TIMERS
        TheGraphDraw = new GraphDraw;
#endif

error: patch failed: Generals/Code/GameEngine/Source/GameClient/GameClient.cpp:434
Hunk #7 succeeded at 501 (offset -22 lines).
Applied patch Generals/GameEngine/Include/GameClient/Intro.h cleanly.
Applied patch Generals/GameEngine/Source/GameClient/Intro.cpp cleanly.
Applied patch Generals/Code/GameEngine/Include/GameClient/GameClient.h cleanly.
Applying patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp with 2 rejects...
Rejected hunk #1.
Hunk #2 applied cleanly.
Hunk #3 applied cleanly.
Hunk #4 applied cleanly.
Hunk #5 applied cleanly.
Rejected hunk #6.
Hunk #7 applied cleanly.

$ git diff 50ff3cf9ccf2f7a194d0d9f9b5cb99ce446cb2bb..5c361a49c26de30b685336a9d1e9155cee3a41f3 > changes.patch

$ git apply -p2 --directory=Generals --reject --whitespace=fix changes.patch             Checking patch Generals/GameEngine/Include/GameClient/Intro.h...
error: Generals/GameEngine/Include/GameClient/Intro.h: No such file or directory
Checking patch Generals/GameEngine/Source/GameClient/Intro.cpp...
error: Generals/GameEngine/Source/GameClient/Intro.cpp: No such file or directory
Checking patch Generals/Code/GameEngine/Include/Common/GlobalData.h...
Hunk #1 succeeded at 364 (offset -1 lines).
Checking patch Generals/Code/GameEngine/Source/Common/CommandLine.cpp...
Checking patch Generals/Code/GameEngine/Source/Common/GameEngine.cpp...
Hunk #1 succeeded at 578 (offset -167 lines).
Hunk #2 succeeded at 599 (offset -167 lines).
Checking patch Generals/Code/GameEngine/Source/Common/GlobalData.cpp...
Hunk #1 succeeded at 1007 (offset -7 lines).
Checking patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp...
error: while searching for:
      TheInGameUI->setCameraTrackingDrawable( FALSE );
  }

        if(TheGlobalData->m_playIntro || TheGlobalData->m_afterIntro)
        {
                // redraw all views, update the GUI
                TheDisplay->UPDATE();

error: patch failed: Generals/Code/GameEngine/Source/GameClient/GameClient.cpp:577
Applied patch Generals/Code/GameEngine/Include/Common/GlobalData.h cleanly.
Applied patch Generals/Code/GameEngine/Source/Common/CommandLine.cpp cleanly.
Applied patch Generals/Code/GameEngine/Source/Common/GameEngine.cpp cleanly.
Applied patch Generals/Code/GameEngine/Source/Common/GlobalData.cpp cleanly.
Applying patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp with 1 reject...
Rejected hunk #1.

$ git diff 722dab9ae7dd621ca1cfe5dbec15b32acee23950..4810e26dbde5af5ef4420dcffdb77b143f0ec874 > changes.patch

$ git apply -p2 --directory=Generals --reject --whitespace=fix changes.patch             Checking patch Generals/GameEngine/Include/GameClient/Intro.h...
error: Generals/GameEngine/Include/GameClient/Intro.h: No such file or directory
Checking patch Generals/GameEngine/Source/GameClient/Intro.cpp...
error: Generals/GameEngine/Source/GameClient/Intro.cpp: No such file or directory
Checking patch Generals/Code/GameEngine/Include/GameClient/GameClient.h...
Hunk #1 succeeded at 88 (offset -4 lines).
Checking patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp...
Hunk #1 succeeded at 699 (offset -36 lines).
Checking patch Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp...
Hunk #1 succeeded at 1908 (offset -89 lines).
Applied patch Generals/Code/GameEngine/Include/GameClient/GameClient.h cleanly.
Applied patch Generals/Code/GameEngine/Source/GameClient/GameClient.cpp cleanly.
Applied patch Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DDisplay.cpp cleanly.

@xezon

xezon commented Jul 15, 2026

Copy link
Copy Markdown
Author

Each individual commit compiles.

@xezon xezon merged commit 355e006 into TheSuperHackers:main Jul 15, 2026
17 checks passed
xezon added a commit that referenced this pull request Jul 15, 2026
@xezon xezon deleted the xezon/add-new-intro branch July 15, 2026 18:43
@Caball009

Caball009 commented Jul 15, 2026

Copy link
Copy Markdown

Is the text in the first post up-to-date? Because the image is not. It'd be good if it mentioned that quickstart skips this logo.

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.