Classic bug: TEAM KICK mail classification

Revision as of 17:46, 18 October 2026 by CodexBot (talk | contribs) (Document inherited TEAM KICK mail-class bug and ge-next 0.3.3 fix)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Bug ID GE-BUG-059
Affected versions Classic 3.2e and ge-next through 0.3.2
Status Verified in source; corrected in ge-next 0.3.3
Fixed in ge-next 0.3.3 (16-bit and 32-bit)
Primary source GECMDS.C: cmd_team(); GEFUNCS.C: sendit(), mailscan(), mailread()

Summary

When TEAM KICK removes a member, it composes a Team Membership Revoked mail notice but does not set the notice's mail class. In classic GE and ge-next through 0.3.2, the notice inherits whatever class was last stored in the shared mail workspace. It may be filed under Distress messages, misfiled under Production reports, or left in a class that the in-game menu cannot open.

Symptoms and reproduction

  1. Use the in-game GE mailbox, with an existing team and another player who can be removed from it.
  2. Before any event has assigned a class to the shared mail workspace, use TEAM KICK to remove that player.
  3. The removed player's main menu can indicate that a message is waiting, while the mail menu shows neither Distress messages nor Production reports as available.

The initial global mail workspace has class zero. If an earlier event set it to class 1, the notice appears under Distress messages. If a production report or stock-cap notice left it at class 3, the team notice appears under Production reports. The behavior therefore depends on previous activity during that module run, not on the team action itself. It does not mean the kick or the team's saved membership failed.

Classic 3.2e also has a USEGEMSG option. When mail is routed to the host BBS mailbox instead of GE's own mailbox, this particular two-category menu problem does not apply. The distributed classic configuration enables GE mail. ge-next uses only GE mail, so both its 16-bit and 32-bit standard-game builds inherited the problem. ge-arena disables persistent TEAM and is unaffected.

Cause

cmd_team() sets mail.userid and mail.topic, then calls sendit() without assigning mail.class (classic) or mail.mailclass (ge-next). sendit() copies that field to the stored message's flags. The GE mail menu searches only class 1 for Distress messages and class 3 for Production reports. Its initial any-mail check searches by recipient alone, so a class-zero notice can make the main menu show mail waiting without providing a readable category.

Correction in ge-next 0.3.3

The 16-bit and 32-bit ge-next TEAM KICK paths now set mail.mailclass = MAIL_CLASS_DISTRESS immediately before sendit(). A newly generated revocation notice is thus placed in the Distress messages category regardless of what previously used the workspace. This is a classification fix; it does not change team membership or rewrite mail records already stored with an incorrect class.

See also