<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://manicpop.org/gewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CodexBot</id>
	<title>Galactic Empire wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://manicpop.org/gewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=CodexBot"/>
	<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/Special:Contributions/CodexBot"/>
	<updated>2026-10-20T13:46:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_registration_and_security_system&amp;diff=2223</id>
		<title>Classic registration and security system</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_registration_and_security_system&amp;diff=2223"/>
		<updated>2026-10-19T16:19:46Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Elyth Gor mention to new article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Galactic Empire 3.2e contains a board-specific registration system, a time-limited test-drive system, protected [[Btrieve]] database handling, and a second concealed system check. These mechanisms are separate from &amp;lt;code&amp;gt;PLAYKEY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SYSKEY&amp;lt;/code&amp;gt;, which control user access and administrative privileges.&lt;br /&gt;
&lt;br /&gt;
The released source contains two largely independent layers. The documented registration and test-drive system is implemented by &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; and was introduced in release 3.0d so GE could be distributed generally. The concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; account check has no visible connection to that system and may have an older origin.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; registration system ==&lt;br /&gt;
=== Security state ===&lt;br /&gt;
The shared &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt; structure records three states:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;code&amp;gt;open_stat&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || The configured registration number is valid for this BBS&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; || The registration number is invalid or absent, but the test drive remains active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Security validation failed or the test drive has expired; GE is disabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;days_run&amp;lt;/code&amp;gt; holds the test-drive startup-day count and &amp;lt;code&amp;gt;days_tot&amp;lt;/code&amp;gt; holds its permitted length. At startup, classic reports the registration number, the current test-drive day, or that the unregistered game is disabled.&lt;br /&gt;
&lt;br /&gt;
When disabled, GE does not schedule ship, NPC, planet, or automatic-update callbacks. Login, cleanup, deletion, hangup, and ordinary command entry also contain guards against operating on the protected databases. A player who enters the module receives the trial-expired notice instead of the game. The records are not erased: entering a valid registration number allows the game to continue where it stopped.&lt;br /&gt;
&lt;br /&gt;
=== Original registration number ===&lt;br /&gt;
Classic&#039;s &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; configuration option accepts an eight-character registration number tied to the host BBS registration number. The internal registration utility identifies Galactic Empire as using seed &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; and method 1. These are also the values actually selected by &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The standalone &amp;lt;code&amp;gt;SECURE.H&amp;lt;/code&amp;gt; contains generic example values (including a different seed and method 0). They are not Galactic Empire&#039;s effective values: &amp;lt;code&amp;gt;sec_opnbtv()&amp;lt;/code&amp;gt; receives GE&#039;s values as arguments from &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Generation algorithm ====&lt;br /&gt;
The publisher&#039;s &amp;lt;code&amp;gt;REGISTER&amp;lt;/code&amp;gt; utility asks for the product seed, method, and customer&#039;s eight-digit MajorBBS or Worldgroup registration number. For GE it generates the key as follows:&lt;br /&gt;
&lt;br /&gt;
# Convert the seed and BBS registration number to integers.&lt;br /&gt;
# XOR the two integer values.&lt;br /&gt;
# Represent the result as an eight-position, right-aligned decimal value.&lt;br /&gt;
# For method 1, add the corresponding seed digit to each position and retain only the last decimal digit.&lt;br /&gt;
&lt;br /&gt;
In compact form, the final operation for each position is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
registration_digit[i] = (xor_digit[i] + seed_digit[i]) % 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The runtime &amp;lt;code&amp;gt;protect()&amp;lt;/code&amp;gt; routine independently derives the same value from MajorBBS&#039;s &amp;lt;code&amp;gt;bturno&amp;lt;/code&amp;gt; and compares it with &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt;. Consequently, a key generated for one registered BBS does not register another.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REGISTER.EXE&amp;lt;/code&amp;gt; was the utility specified for Galactic Empire and [[The Legend of Elyth Gor]]. The accompanying &amp;lt;code&amp;gt;REG2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REG3&amp;lt;/code&amp;gt; algorithms were intended for other M.B. Murdock products and are not used by GE.&lt;br /&gt;
&lt;br /&gt;
=== Protected databases ===&lt;br /&gt;
The ship and mail databases are opened normally. The planet and user databases are opened through &amp;lt;code&amp;gt;sec_opnbtv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The routine derives the correct board-specific registration value even while the game is running as an unregistered test drive. It supplies that value to the Btrieve open path and invokes Btrieve operation 29 (Set Owner), binding the protected files to the board-specific value.&lt;br /&gt;
&lt;br /&gt;
Each protected database also receives a concealed record whose first key is a high-valued byte string defined by &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. The remaining bytes hold four encoded fields:&lt;br /&gt;
&lt;br /&gt;
* the first test-drive date;&lt;br /&gt;
* the last date on which the module was started;&lt;br /&gt;
* the number of distinct startup dates; and&lt;br /&gt;
* a second copy of the first date tied to the BBS registration number.&lt;br /&gt;
&lt;br /&gt;
The stored bytes are additionally offset by their positions in the record. This is obfuscation and tamper detection, not encryption in the modern sense. On each new calendar date, the run counter and last-run date are updated.&lt;br /&gt;
&lt;br /&gt;
For the original GE seed, characters 1 and 7 are combined to produce a 15-day test-drive limit. The test drive is rejected if its initial date is in the future, elapsed calendar time exceeds the limit, the startup-day count exceeds the limit, or the redundant board-bound date does not agree. This means both clock rollback and simply avoiding daily use are accounted for: elapsed calendar time is checked independently of the number of days on which GE started.&lt;br /&gt;
&lt;br /&gt;
Because the security information is stored as an otherwise valid database record, code that walks the user database must recognize and skip the &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; record. Classic&#039;s midnight cleanup does this explicitly. A port or database tool that treats every record as a player can expose the security record in a roster or, worse, rewrite it as player data.&lt;br /&gt;
&lt;br /&gt;
==== Startup cross-check ====&lt;br /&gt;
&amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; first opens the planet database and saves its resulting security state. It then opens the user database and requires both databases to agree on &amp;lt;code&amp;gt;open_stat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;days_tot&amp;lt;/code&amp;gt;. A disagreement causes a fatal &amp;lt;code&amp;gt;Secure Stat Open failure&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Secure Days Open failure&amp;lt;/code&amp;gt;. This prevents the game from quietly combining protected files with incompatible security state.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; contains a commented build-time &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; switch. When enabled, the planet and user files use ordinary &amp;lt;code&amp;gt;opnbtv()&amp;lt;/code&amp;gt;, and a dummy &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt; structure reports a registered state. It bypasses the protected open, trial counter, and cross-database registration checks.&lt;br /&gt;
&lt;br /&gt;
The switch is disabled in the released source. It is also not a complete removal of all security-related code: the separate &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; check remains compiled and callable.&lt;br /&gt;
&lt;br /&gt;
== Common online 3.2e build ==&lt;br /&gt;
A 3.2e package commonly distributed with MBBSEmu differs from the released source configuration. Its &amp;lt;code&amp;gt;REGIST.TXT&amp;lt;/code&amp;gt; instructs the sysop to &amp;quot;Use your activation code for MBBS&amp;quot; rather than obtain the derived GE registration number.&lt;br /&gt;
&lt;br /&gt;
Running the DLL with the default &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; produces GE&#039;s trial-expired message. It also creates and evaluates the concealed records in both protected databases. It therefore is &#039;&#039;&#039;not&#039;&#039;&#039; a &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; build.&lt;br /&gt;
&lt;br /&gt;
Decoding a newly created security record shows that its date is stored without the XOR transformation that the original &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; seed would produce. The DLL contains no &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; string and instead has a second &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt; string consistent with a replaced seed. Its effective security seed is &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
That change has two consequences:&lt;br /&gt;
&lt;br /&gt;
* XOR with zero leaves &amp;lt;code&amp;gt;bturno&amp;lt;/code&amp;gt; unchanged, and method-1 digit addition with zero changes no digits. The valid &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is therefore the BBS&#039;s own eight-digit registration number.&lt;br /&gt;
* The test-drive length is derived from positions 1 and 7 of the seed. A zero seed produces a zero-day allowance, so an incorrect or absent &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is disabled immediately.&lt;br /&gt;
&lt;br /&gt;
This exactly matches the package&#039;s instructions and observed behavior. The change could have been made by rebuilding after changing the source constant, or by replacing the eight ASCII bytes &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt; directly in the DLL. The resulting binary alone cannot distinguish between those methods.&lt;br /&gt;
&lt;br /&gt;
== The concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; check ==&lt;br /&gt;
&amp;lt;code&amp;gt;GELIB.C&amp;lt;/code&amp;gt; describes &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; only as &amp;quot;Verify system.&amp;quot; Its name does not describe its operation. On its first call, it constructs the otherwise unobvious account key &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt;, selects MajorBBS&#039;s account database, and searches key 0. If that account record exists, GE terminates with &amp;lt;code&amp;gt;GE SYSTEM FAULT&amp;lt;/code&amp;gt;. If it does not exist, a static flag prevents the test from running again during that module load.&lt;br /&gt;
&lt;br /&gt;
The released GE source contains no routine that creates the &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt; account, so the intended path by which that marker would be placed cannot be established from GE&#039;s source alone.&lt;br /&gt;
&lt;br /&gt;
Rather than calling this check visibly during initialization, classic places it inside &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;, GE&#039;s floating-point absolute-value helper. Normal navigation and combat mathematics eventually call &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;, which makes the security test occur indirectly. The function also changes the current Btrieve context to the account database and does not restore the prior context; ports should understand that as an implementation side effect, not as part of absolute-value behavior.&lt;br /&gt;
&lt;br /&gt;
=== Possible earlier origin ===&lt;br /&gt;
Before version 3, GE was distributed for MajorBBS 5.x as source that became part of the compiled BBS rather than as a drop-in module DLL. The release notes specifically identify the &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt;-style registration protection as a new 3.0d feature. By contrast, &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; is independent of that system, survives the &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; bypass, and checks for a marker that no surviving 3.2e routine creates.&lt;br /&gt;
&lt;br /&gt;
These facts make it plausible that &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; is a remnant of an earlier source-distribution-era protection scheme, perhaps paired with an old installer, build procedure, or security component that created &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt;. No pre-3.x implementation or marker-creation utility is present in the available archive, however, so this remains a historical hypothesis rather than an established fact.&lt;br /&gt;
&lt;br /&gt;
== Source integration ==&lt;br /&gt;
The classic implementation is distributed across several locations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Location !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; || Protected Btrieve open, owner setup, registration comparison, trial record, counters, and tamper checks&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SECURE.H&amp;lt;/code&amp;gt; || Generic declarations and sample defaults; not the authoritative GE constants&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt; || GE&#039;s actual method, seed, high-key value, structure declaration, and prototype&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; || Protected database opens, cross-checks, scheduler and entry guards, status messages, and &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GELIB.C&amp;lt;/code&amp;gt; || Concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; account check through &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GECMDS.C&amp;lt;/code&amp;gt; || Implementation of the diagnostic &amp;lt;code&amp;gt;RG#&amp;lt;/code&amp;gt; display&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MBMGEMP.LNK&amp;lt;/code&amp;gt; || Links the separately compiled security object into the module&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;register/REGISTER.CPP&amp;lt;/code&amp;gt; || Publisher-side method-1 registration-number generator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The installation manual documents &amp;lt;code&amp;gt;RG#&amp;lt;/code&amp;gt; as a technical-support command that reports the configured registration number, security state, and test-drive day. Its command-table entry is commented out in 3.2e, although the handler remains in the source; see [[Commands#Administration and diagnostics]]. The classic [[Who command|&amp;lt;code&amp;gt;WHO&amp;lt;/code&amp;gt;]] terminal-support command likewise exposes the BBS registration number in PHARLAP/MajorBBS 6.x builds.&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
ge-next does not enforce classic&#039;s commercial registration or test-drive system and does not place security records in its databases. Its &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; setting is only an optional installation identifier, not an unlock key. Since version 0.3.2, a blank or zero value produces no registration line at startup; a configured value is shown there and can distinguish multiple installations. &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is not player authentication or a frontend pairing code: the separate &amp;lt;code&amp;gt;FRONTEND&amp;lt;/code&amp;gt; option controls [[Data command|DATA]] access.&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Sysop documentation]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=The_Legend_of_Elyth_Gor&amp;diff=2222</id>
		<title>The Legend of Elyth Gor</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=The_Legend_of_Elyth_Gor&amp;diff=2222"/>
		<updated>2026-10-19T16:19:43Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add brief Elyth Gor article and verified archive download&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Legend of Elyth Gor&#039;&#039;&#039; is a multiplayer fantasy-adventure game module for [[MajorBBS integration|The Major BBS]], created by Mike Murdock and published by M. B. Murdock &amp;amp; Associates. It is a separate game, not a Galactic Empire expansion. The surviving version 2.0d package includes the game module, message and room files, and player and sysop guides.&lt;br /&gt;
&lt;br /&gt;
The [https://raw.githubusercontent.com/SysopNetwork/The-Major-BBS-ISV-File-Libraries/main/ISVMBM%20-%20Murdock%20Development/MBMGO20D.ZIP MBMGO20D.ZIP archive] is available from the SysopNetwork Major BBS ISV file library.&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Combat&amp;diff=2219</id>
		<title>Combat</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Combat&amp;diff=2219"/>
		<updated>2026-10-19T06:40:01Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Document ge-next Cybertron-Droid combat, CATTKD, distress, and pacing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Combat&#039;&#039;&#039; in &#039;&#039;Galactic Empire&#039;&#039; happens in real time. Ships continue moving and turning, systems recharge, and projectiles continue flying while players choose commands. A target that was in range during a scan may have moved by the time a shot is fired. This page explains how an encounter fits together; the linked weapon and system pages cover the detailed calculations.&lt;br /&gt;
&lt;br /&gt;
== From contact to attack ==&lt;br /&gt;
A [[Scan command#Sector scan|sector scan]] or [[Scan command#Range scan|range scan]] reveals ships that the current scanners can detect. A [[Scan command#Ship scan|ship scan]] gives more detail about a selected contact. Scanner jamming, cloaking, nebulas, and distance can limit what is visible. Scan letters identify contacts on the player&#039;s current display; a [[Locks|lock]] remembers a particular ship rather than relying on its letter remaining the same.&lt;br /&gt;
&lt;br /&gt;
A [[Locks|lock]] can be used as &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; with [[Torpedo command|&amp;lt;code&amp;gt;TORPEDO&amp;lt;/code&amp;gt;]], [[Missile command|&amp;lt;code&amp;gt;MISSILE&amp;lt;/code&amp;gt;]], and [[Scan command|&amp;lt;code&amp;gt;SCAN SHIP&amp;lt;/code&amp;gt;]]. It does not guarantee a firing solution or make an out-of-range ship hittable. Standard [[Phaser command|&amp;lt;code&amp;gt;PHASER&amp;lt;/code&amp;gt;]] instead takes a relative bearing and fires through an arc; it does not aim at a ship letter or &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;. A moving target may leave that arc before the shot is processed. See [[Scan command]], [[Lock command]], and [[Bearing]].&lt;br /&gt;
&lt;br /&gt;
Weapons also depend on the firing ship&#039;s state. A class may lack a launcher or phaser capability, a system may be damaged or recharging, and a shot may require ammunition or [[Flux|neutron flux]]. Ordinary phasers and torpedoes operate at impulse, while hyper-phasers and missiles can engage ships in hyperspace. [[Neutral zone|Sector 0 0]] imposes additional restrictions.&lt;br /&gt;
&lt;br /&gt;
== Weapons ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Weapon !! Where it operates !! What happens&lt;br /&gt;
|-&lt;br /&gt;
| [[Phasers]] || Impulse || A directional beam strikes eligible ships in its arc immediately. A wider spread covers more angles but concentrates less damage.&lt;br /&gt;
|-&lt;br /&gt;
| [[Hyper-phasers]] || Hyperspace || A narrow beam fires at hyperspace contacts and consumes flux. Its range and hit-report behavior differ between classic GE and ge-next.&lt;br /&gt;
|-&lt;br /&gt;
| [[Torpedoes]] || Impulse || A guided projectile travels toward one ship. A target entering hyperspace breaks its ordinary impulse-space track.&lt;br /&gt;
|-&lt;br /&gt;
| [[Missiles]] || Impulse and hyperspace || A guided projectile is charged from the launcher&#039;s flux supply; charge affects damage and flight. Classic and ge-next have different charge limits and flight rules.&lt;br /&gt;
|-&lt;br /&gt;
| [[Mines]] || Local area || A laid mine counts down at a fixed position and can damage multiple ships, including its layer. [[Zippers]] can trigger nearby mines early.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ion cannons]] || Planetary defense || An armed planet fires automatically at qualifying attackers; players do not launch these as ship weapons.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The ship-weapon command pages explain how to fire or lay each weapon; the linked topic pages explain what happens after launch or impact. Planetary ion cannons fire automatically. For [[Attacking planets|planetary assault]], players instead send fighters or troops against a planet&#039;s defenses. This is a separate combat path from ship-to-ship fire.&lt;br /&gt;
&lt;br /&gt;
== Defense and countermeasures ==&lt;br /&gt;
* [[Shields]] protect against applicable hits while raised and supplied with flux. A standard phaser hit is deflected completely rather than spilling its calculated damage onto the hull; other weapons can still inflict hull damage through shields. Successful phaser, torpedo, and missile firing lowers the player&#039;s raised shields, which do not rise again automatically.&lt;br /&gt;
* [[Decoys]] can intercept incoming torpedoes or missiles. They are temporary and do not guarantee protection.&lt;br /&gt;
* [[Cloaking]] hides a capable ship from ordinary detection and guidance, but uses flux and does not prevent every kind of attack.&lt;br /&gt;
* [[Jamming]] interferes with nearby scanners and guidance, including those of the ship using the jammer.&lt;br /&gt;
* [[Zippers]] detonate nearby mines, potentially clearing a route but also creating an immediate blast hazard.&lt;br /&gt;
* [[Ship upgrades#Armor plating|Armor plating]] ([[ge-next]] only) reduces certain damage when installed on capable ships, see [[Ship upgrades]].&lt;br /&gt;
&lt;br /&gt;
Speed, position, and timing matter too: a ship may outrun or evade a threat that it cannot absorb.&lt;br /&gt;
&lt;br /&gt;
== Damage and the combat timer ==&lt;br /&gt;
Hits can increase structural damage, drain or damage shields, and disable individual systems. The displayed damage description does not reveal the ship&#039;s exact structural value. Ordinary damage control works during ship updates; [[Maintenance command|planetary maintenance]] is a separate service with its own orbit and hostility requirements. See [[Hull damage]], [[System damage]], and [[Maintenance]].&lt;br /&gt;
&lt;br /&gt;
Combat actions set a timer that temporarily prevents an ordinary &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; [[Exit command|exit]]. A player who disconnects during that period may lose the ship, with [[kill credit]] assigned under the game&#039;s normal rules. In [[ge-arena]], the timer is shorter and maintenance has different costs and availability. Ship destruction is normally processed on an update after structural damage reaches the fatal threshold; this brief interval does not mean a ship is safe. ge-next blocks most functions of an already-doomed ship during it.&lt;br /&gt;
&lt;br /&gt;
== Kill credit, scoring, and salvage ==&lt;br /&gt;
A ship records its most recent qualifying attacker in &amp;lt;code&amp;gt;lastfired&amp;lt;/code&amp;gt;. The attack that first pushes damage over the fatal threshold is not necessarily the one that receives credit: another effective hit before destruction is processed can change that field. Incoming projectiles and laid mines may strike after their owner has moved or even after that owner&#039;s ship was destroyed. Environmental damage and ownerless weapons have their own attribution rules. See [[Kill credit]] for the classic and ge-next differences.&lt;br /&gt;
&lt;br /&gt;
A credited kill can add points and let the attacker recover cargo from the wreck, subject to available hold space; the defeated player&#039;s score can also change. In ge-next, recovery prioritizes as much gold as will fit, then attempts a randomized portion of other recoverable items. Men, troops, and spies are presumed lost after ship destruction and not salvageable. Classic GE uses the same randomized recovery but does not prioritize gold, meaning a near-capacity ship might pick up less valuable cargo. See [[Scoring and rosters]], [[Gold]], and [[Ship inventory]].&lt;br /&gt;
&lt;br /&gt;
In classic GE, a player who destroys another player&#039;s ship also has a chance to recover a &#039;&#039;secret document&#039;&#039; listing the defeated player&#039;s planets. This is enabled by the compile-time &amp;lt;code&amp;gt;SHOWDOC&amp;lt;/code&amp;gt; definition, with default odds of one in six set by &amp;lt;code&amp;gt;RNDDOC&amp;lt;/code&amp;gt;. Standard ge-next instead makes &amp;lt;code&amp;gt;SHOWDOC&amp;lt;/code&amp;gt; a configurable 0–10 option (0 disables it; 10 always awards it), and picks displayed planets at random instead of always displaying the user&#039;s first planets established.. This information reward is separate from cargo salvage and does not apply to ge-arena. See [[GEREADME.DOC#01/10/90_Release_2.1a|the 2.1a release notes]].&lt;br /&gt;
&lt;br /&gt;
ge-arena uses match-specific scoring and respawns rather than deleting a participant&#039;s persistent ship. It retains item and gold recovery after kills, but the winner depends on the active [[ge-arena|mode]], not necessarily the number of ships destroyed.&lt;br /&gt;
&lt;br /&gt;
== Cybertron vs. Droid behavior in ge-next ==&lt;br /&gt;
In ge-next, [[Cybertrons]] and [[Droids]] can fight each other rather than interacting only with player ships. Classic GE does not initiate these Cybertron–Droid encounters. The &amp;lt;code&amp;gt;CATTKD&amp;lt;/code&amp;gt; option in [[Main configuration reference|MPOGEMSG.MSG]] controls how readily new NPC fights begin: 0 prevents new encounters, 10 permits them without the usual limit, and intermediate values affect both the chance of an encounter and the number of Cybertrons that can be pursuing Droids at once. The default is 5. Eligible ships still have to meet their class targeting rules, and Cybertrons do not pick new NPC fights when no players are in the game.&lt;br /&gt;
&lt;br /&gt;
When a Droid that sends distress calls takes an attacker as its target, it broadcasts the attacker&#039;s name and its sector. The distress system remembers that attacker; a player credited with destroying it while the call is active can receive a bonus based on the Droid&#039;s class and have that faction&#039;s hostility cleared. See [[Droids]] and [[Kill credit]].&lt;br /&gt;
&lt;br /&gt;
NPC fights are deliberately paced more slowly than fights against players. Cybertrons and Droids targeting another NPC receive a longer interval between behavior updates. Standard and hyper-phaser hits between NPCs also have a toughness-based cap on &#039;&#039;unshielded hull damage&#039;&#039;, preventing a powerful phaser shot from ending the fight in one hit. This cap does not describe damage against player ships or every other weapon and shield interaction. See [[Phasers]].&lt;br /&gt;
&lt;br /&gt;
== Other threats and rules ==&lt;br /&gt;
[[Cybertrons]] and other [[Droids|automated ships]] use many of the same weapons but have their own targeting and movement logic. Planetary combat, [[Self-destruct|self-destruct shock waves]], wormholes, collisions, and the [[Galactic perimeter|galactic boundary]] can also damage a ship. They do not all follow ordinary weapon damage or kill-credit rules.&lt;br /&gt;
&lt;br /&gt;
Classic GE and ge-next differ in several important combat details. ge-next applies [[DAMF]] consistently to phaser damage, rebalances missile charge and flux use, improves projectile ownership and kill attribution, and avoids lowering a player&#039;s shields for failed torpedo or missile launches. The linked weapon, shield, and kill-credit pages explain each change without treating ge-next behavior as if it were universal.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Hull damage]], [[System damage]], [[Maintenance]], and [[Kill credit]]&lt;br /&gt;
* [[Attacking planets]], [[Neutral zone]], and [[Self-destruct]]&lt;br /&gt;
* [[Phaser command]], [[Torpedo command]], [[Missile command]], and [[Mine command]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Combat]]&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Torpedoes&amp;diff=2207</id>
		<title>Torpedoes</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Torpedoes&amp;diff=2207"/>
		<updated>2026-10-18T22:22:44Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Clarify torpedo travel rate versus hyperspace tracking&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Torpedoes are guided impulse-space weapons stored as ship inventory. Each launched torpedo is tracked as an incoming round on its target rather than as an independently moving object. The [[Torpedo command]] page covers command syntax, launch checks, and firing behavior.&lt;br /&gt;
&lt;br /&gt;
== Guidance and launch envelope ==&lt;br /&gt;
&lt;br /&gt;
A launch succeeds only if the target is in scanner range and the guidance factor exceeds 0.7. The factor is determined by both ships&#039; combined speed and their distance in sectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
factor = (1.2 - ((shooter speed + target speed) / 5000))&lt;br /&gt;
       * ((5 - distance in sectors) / (TORFACT / 10))&lt;br /&gt;
launch succeeds if factor &amp;gt; 0.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The classic configuration description incorrectly calls &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; the opponent&#039;s speed; classic 3.2e and ge-next both use the sum of the firing ship&#039;s and target&#039;s speeds. With the default &amp;lt;code&amp;gt;TORFACT&amp;lt;/code&amp;gt; of 40, two stationary ships can lock at just under 26,667 distance units, a near-full-impulse shooter against a stationary target at roughly 22,000, and two ships near full impulse at roughly 15,000. Scanner range can impose a shorter limit, and a target at warp cannot be locked.&lt;br /&gt;
&lt;br /&gt;
Each target has three incoming torpedo slots, shared among all attackers. Classic ship classes define torpedo capability as yes or no and have no per-launcher reload counter. ge-next defines zero to three launchers; each can fire once during a ship-state update, after which it reloads for the next update. A target with all three inbound slots occupied cannot accept another torpedo.&lt;br /&gt;
&lt;br /&gt;
== Flight and interception ==&lt;br /&gt;
&lt;br /&gt;
At launch, the target&#039;s incoming record stores the firing ship slot and the distance between the ships, plus a small 20-unit offset. On each target ship-state update, the stored distance decreases by &amp;lt;code&amp;gt;TORPSPED&amp;lt;/code&amp;gt;, whose stock value is 2,441 distance units per update. Ship-state updates normally occur about every six seconds. Although torpedoes are presented as weapons of normal space and cannot follow a ship into hyperspace, this travel rate is in the warp-speed range. It is a distance countdown, not a torpedo entering hyperspace. The torpedo hits once its remaining distance is no greater than one movement step. Since this countdown belongs to the target, ordinary impulse movement after launch does not let the target outrun or redirect the torpedo; the ships&#039; speeds affect only the initial guidance solution.&lt;br /&gt;
&lt;br /&gt;
Classic processes a torpedo only while its stored distance is greater than one. At launch, it truncates the measured separation to an integer and adds 20; a flight update then subtracts &amp;lt;code&amp;gt;TORPSPED&amp;lt;/code&amp;gt; only if the torpedo is still more than one movement step away. If a subtraction leaves exactly 1, the next update skips the torpedo instead of resolving the hit. The vulnerable separations are those for which &amp;lt;code&amp;gt;(truncated distance + 20) modulo TORPSPED = 1&amp;lt;/code&amp;gt;. With the stock speed of 2,441, the first is a truncated separation of 2,422 units (stored as 2,442, then reduced to 1); another occurs every 2,441 units within the permitted launch range. See [[Classic bug: Torpedo stalls at distance one]] for the full sequence. ge-next processes every positive distance and fixes this edge case.&lt;br /&gt;
&lt;br /&gt;
Entering hyperspace breaks incoming torpedo tracks. A decoy can intercept an incoming torpedo when it is within 5,000 distance units; each eligible decoy gets a separate one-in-&amp;lt;code&amp;gt;DECODDS&amp;lt;/code&amp;gt; chance per ship-state update, with a stock value of 11. A successful interception destroys both the decoy and torpedo. ge-next also clears incoming ordnance when a target enters a wormhole, leaves play, or is protected by the Enforcer Planet as the projectile closes in. Classic&#039;s 3.2d wormhole change attempted to stop projectiles from following a ship, but called the routine that cleared ownership rather than the routine that clears incoming projectiles; ge-next corrected this in 0.2.4 ([[Classic bug: Wormhole projectile cleanup]]).&lt;br /&gt;
&lt;br /&gt;
== Impact ==&lt;br /&gt;
&lt;br /&gt;
With the stock &amp;lt;code&amp;gt;TDAMMAX&amp;lt;/code&amp;gt; of 35, an unshielded hit applies a random amount from 50% to less than 100% of that maximum before target durability is applied. A shielded impact applies a lower random hull-damage amount, from zero to less than 50% of the maximum, and separately damages the shields. The target ship&#039;s DAMF scales hull damage in both classic 3.2e and ge-next; ge-next also reduces damage when armor plating is installed.&lt;br /&gt;
&lt;br /&gt;
A hit can trigger random damage to ship systems or carried items. Classic resolves and reports each torpedo impact independently. ge-next combines impacts from one update into a single damage report and one random-damage assessment, while preserving kill attribution for each distinct projectile owner.&lt;br /&gt;
&lt;br /&gt;
== Ownership and combat consequences ==&lt;br /&gt;
&lt;br /&gt;
A launched torpedo retains its firing ship slot for impact messages and credit. In ge-next, destroying the firing ship does not erase its torpedoes; if the firer leaves the game, its surviving projectiles are marked as ownerless so they cannot be credited to a later occupant of that [[Ship slot|ship slot]]. ge-arena retains projectile ownership through destruction and respawn, removing ownership only when the player leaves the match.&lt;br /&gt;
&lt;br /&gt;
An incoming torpedo keeps its target in combat until it hits, is intercepted, or is cleared. Classic also starts combat timers on a failed guidance attempt, whereas ge-next does so only after a successful launch; see [[Torpedo command]]. Active torpedoes and their remaining distances can be inspected with [[Report command|&amp;lt;code&amp;gt;REPORT ORDNANCE&amp;lt;/code&amp;gt;]] in ge-next.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Torpedo command]]&lt;br /&gt;
* [[Missiles]]&lt;br /&gt;
* [[Decoys]]&lt;br /&gt;
* [[Wormholes]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Combat]]&lt;br /&gt;
[[Category:Weapons]]&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Team_command&amp;diff=2204</id>
		<title>Team command</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Team_command&amp;diff=2204"/>
		<updated>2026-10-18T21:46:37Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link TEAM KICK mail-class bug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;TEAM&#039;&#039;&#039; command creates and manages persistent player teams in classic Galactic Empire and standard ge-next. For team scoring, shared planet access, persistence, and version-specific implementation changes, see [[Teams]]. The command is disabled in ge-arena.&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM START number founder-secret password name&amp;lt;/code&amp;gt;&lt;br /&gt;
| Create a team and join it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM JOIN number password&amp;lt;/code&amp;gt;&lt;br /&gt;
| Join an existing team.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM UNJOIN&amp;lt;/code&amp;gt;&lt;br /&gt;
| Leave the current team.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM SCORE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Display team standings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM MEMBERS&amp;lt;/code&amp;gt;&lt;br /&gt;
| List members of your current team.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM KICK founder-secret user&amp;lt;/code&amp;gt;&lt;br /&gt;
| Remove a member.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM NEWPASS founder-secret password&amp;lt;/code&amp;gt;&lt;br /&gt;
| Change the joining password.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TEAM NEWNAME founder-secret name&amp;lt;/code&amp;gt;&lt;br /&gt;
| Rename the team.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As with other GE commands, most subcommands can be abbreviated to their first three letters. The full forms above are easier to recognize.&lt;br /&gt;
&lt;br /&gt;
== Creating and joining ==&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
TEAM START 12345 founderkey memberpass Example Team&lt;br /&gt;
TEAM JOIN 12345 memberpass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The team number must be five digits and represent a nonzero code. The founder secret authorizes &amp;lt;code&amp;gt;KICK&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NEWPASS&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;NEWNAME&amp;lt;/code&amp;gt;; the separate member password is used with &amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt;. Each credential can have up to ten characters, and the team name can have up to 30. Starting a team automatically joins its creator.&lt;br /&gt;
&lt;br /&gt;
The founder secret is not tied to the founder&#039;s account: any member who knows it can perform founder operations. Treat both credentials as game passwords, not as substitutes for BBS or other account passwords.&lt;br /&gt;
&lt;br /&gt;
ge-next 0.3 additionally requires a team name of at least five characters beginning with a letter. It does not allow a player to join or start another team while still on a valid team; use &amp;lt;code&amp;gt;TEAM UNJOIN&amp;lt;/code&amp;gt; first. Classic does not consistently enforce these restrictions.&lt;br /&gt;
&lt;br /&gt;
The game supports up to 50 team records. The sysop&#039;s &amp;lt;code&amp;gt;TEAMMAX&amp;lt;/code&amp;gt; option limits membership in one team; its default is ten. See [[Teams]] for how ge-next handles empty teams and retired team numbers.&lt;br /&gt;
&lt;br /&gt;
== Leaving and founder actions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TEAM UNJOIN&amp;lt;/code&amp;gt; removes your membership. A member who knows the founder secret can kick another member, change the joining password, or rename the team. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
TEAM KICK founderkey OtherPlayer&lt;br /&gt;
TEAM NEWPASS founderkey newpass&lt;br /&gt;
TEAM NEWNAME founderkey New Team Name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TEAM KICK&amp;lt;/code&amp;gt; can target an offline player and sends an in-game mail notice to the removed member; see [[Classic bug: TEAM KICK mail classification]] for a classic mailbox-class error corrected in ge-next 0.3.3. ge-next applies the same name rules to &amp;lt;code&amp;gt;TEAM NEWNAME&amp;lt;/code&amp;gt; as to &amp;lt;code&amp;gt;TEAM START&amp;lt;/code&amp;gt; and rejects a name already used by another active team.&lt;br /&gt;
&lt;br /&gt;
== Viewing teams ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TEAM MEMBERS&amp;lt;/code&amp;gt; lists the members of your current team. &amp;lt;code&amp;gt;TEAM SCORE&amp;lt;/code&amp;gt; lists active teams in score order. The standings use member planet and kill scores plus a per-member bonus; the formula and the differences between classic and ge-next are explained in [[Teams#Team scoring|Team scoring]].&lt;br /&gt;
&lt;br /&gt;
== Undocumented classic command ==&lt;br /&gt;
&lt;br /&gt;
Classic GE also accepts &amp;lt;code&amp;gt;TEAM DUMPITOUT&amp;lt;/code&amp;gt;, although it is not listed in the command help. It prints the internal team table, including each team&#039;s joining password and founder secret, to the player who enters it. Because those credentials should not be public, ge-next 0.3 removed this subcommand from &amp;lt;code&amp;gt;TEAM&amp;lt;/code&amp;gt; and made the diagnostic dump available only through the privileged [[Sys command|&amp;lt;code&amp;gt;SYS TEAMDUMP&amp;lt;/code&amp;gt;]] command.&lt;br /&gt;
&lt;br /&gt;
== ge-arena ==&lt;br /&gt;
&lt;br /&gt;
ge-arena does not use the persistent team database, so &amp;lt;code&amp;gt;TEAM&amp;lt;/code&amp;gt; is disabled. Planned arena team modes will assign match-specific teams in memory rather than use this command.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MBMGEHLP.MSG#HELP_TEAM|Classic HELP TEAM]]&lt;br /&gt;
* [[Teams]]&lt;br /&gt;
* [[Send command]]&lt;br /&gt;
* [[Report command]]&lt;br /&gt;
* [[Classic bug: Team state inconsistency]]&lt;br /&gt;
* [[Classic bug: Reused deleted team identifiers]]&lt;br /&gt;
* [[Classic bug: Unterminated team-creation fields]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Commands]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Mail&amp;diff=2203</id>
		<title>Mail</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Mail&amp;diff=2203"/>
		<updated>2026-10-18T21:46:34Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Document TEAM KICK mail classification and correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Mail&#039;&#039;&#039; is how &#039;&#039;Galactic Empire&#039;&#039; delivers reports and notices that a player may not see when they occur. The in-game main menu calls these &#039;&#039;Hyperspace messages&#039;&#039; and divides them into &#039;&#039;&#039;Distress messages&#039;&#039;&#039; and &#039;&#039;&#039;Production reports&#039;&#039;&#039;. These are broad mailbox categories, not literal descriptions of every message in them: spy intelligence and team notices are filed with distress messages, while notices about full planetary stock are filed with production reports. ge-arena does not use the persistent mail system.&lt;br /&gt;
&lt;br /&gt;
== Reading messages ==&lt;br /&gt;
From the GE main menu, choose &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, then &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; for distress messages or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; for production reports. A category with mail is marked &amp;lt;code&amp;gt;NEW&amp;lt;/code&amp;gt;. After reading a message, choose &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; for the next one or &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; to return. &#039;&#039;&#039;Reading a message deletes it&#039;&#039;&#039; from the in-game mailbox; the menu is not a permanent archive. The sysop&#039;s &amp;lt;code&amp;gt;MAILDAYS&amp;lt;/code&amp;gt; setting controls automatic removal of old GE-mail messages, with a shipped value of three days and an allowed range of one to seven. See [[Main configuration reference]] and [[Database files]].&lt;br /&gt;
&lt;br /&gt;
Classic GE can route its generated mail either to its own mailbox or to the host BBS&#039;s mail system through &amp;lt;code&amp;gt;USEGEMSG&amp;lt;/code&amp;gt;. The distributed 3.2e configuration has the GE mailbox enabled, although the [[GEREADME.DOC|classic release notes]] describe a period when BBS mail was the default. ge-next uses the GE mailbox only; it removed the seldom-used BBS-mail route when rebuilding its mail structures. This setting concerns automated GE mail, not the player-to-player [[Send command|SEND]] command.&lt;br /&gt;
&lt;br /&gt;
== Daily planetary reports ==&lt;br /&gt;
During the [[Game execution flow#Midnight routine|midnight routine]], GE sends the owner a separate &#039;&#039;&#039;Production Report&#039;&#039;&#039; for each owned planet it finds. The report is a snapshot of the planet&#039;s name and sector, cash, tax, and stock of every item. It is assembled during daily scoring and accounting, not whenever an individual production pass runs. Classic&#039;s report also includes the old planetary debt field; ge-next no longer displays that unused value. See [[Planetary update cycle]] for the separate scheduled production passes and [[Planetary production]] for what changes during one pass.&lt;br /&gt;
&lt;br /&gt;
== Planetary event mail ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Event !! Recipient and message&lt;br /&gt;
|-&lt;br /&gt;
| Significant [[Attacking planets|troop or fighter attack]] || The planet owner can receive a distress message identifying the attacker, attacking force, and whether the planet held or surrendered. Trivial attacks are not mailed. If the owner is actively playing, the game may notify them directly instead of queuing this attack mail.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary production|Food shortage]] || The planet owner receives a distress message when troops or men are lost to starvation during a reported production pass.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary production|Production reaches a stock cap]] || The planet owner receives a status message identifying the item and the planet&#039;s effective maximum. This is filed under the menu&#039;s &#039;&#039;Production reports&#039;&#039; category. Classic&#039;s repeated notices are described in [[Classic bug: Disabled production repeats maximum-stock notices]]; ge-next suppresses them when production is set to zero.&lt;br /&gt;
|-&lt;br /&gt;
| [[Taxes|Revolt]]|| The former owner receives a message that the population overpowered the troops and the planet became free.&lt;br /&gt;
|-&lt;br /&gt;
| [[Spies|Spy discovered]] || The spy&#039;s owner is told the operative was caught; the planet owner receives a separate protest naming the infiltrator.&lt;br /&gt;
|-&lt;br /&gt;
| [[Spies|Spy intelligence]] || A surviving spy may send an estimate of one planetary stock quantity. Certain significant attacks can also produce a report identifying the attacker or warning that the planet was captured. Spy reports are not guaranteed on every update or attack; see [[Classic bug: Planet spy attack result inversion]] for a classic reporting defect.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Team command|TEAM KICK]] sends a &#039;&#039;&#039;Team Membership Revoked&#039;&#039;&#039; notice to the removed member. In classic GE and ge-next through 0.3.2, the send path did not assign a mail class, so the notice could be misfiled or inaccessible from the in-game mail menu; see [[Classic bug: TEAM KICK mail classification]]. ge-next 0.3.3 files new revocation notices under Distress messages. This is an event notice, not part of the nightly production-report sweep.&lt;br /&gt;
&lt;br /&gt;
== Delivery and version differences ==&lt;br /&gt;
Classic&#039;s [[Planetary update cycle|planetary scheduler]] can visit one planet more or fewer times than another in a day, so event mail tied to those visits is not a reliable daily checklist. ge-next records completed production passes and can replay missed ones after downtime. To avoid a backlog of duplicate notices, it sends event mail only for the final replayed pass; the daily snapshot is still generated separately at midnight. See [[Classic bug: Skipped planetary updates]].&lt;br /&gt;
&lt;br /&gt;
Mail delivery also depends on having a valid recipient. In classic, a rejected message could leave formatted text in the shared output buffer and leak it into later output. ge-next clears that buffer when declining mail to a non-live recipient; see [[Classic bug: Rejected mail leaks into output]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Planetary update cycle]]&lt;br /&gt;
* [[Planetary production]]&lt;br /&gt;
* [[Attacking planets]]&lt;br /&gt;
* [[Spies]]&lt;br /&gt;
* [[Teams]]&lt;br /&gt;
* [[Data structures#Mail|Mail records]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Game reference]]&lt;br /&gt;
[[Category:Planets]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug_database&amp;diff=2202</id>
		<title>Classic bug database</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug_database&amp;diff=2202"/>
		<updated>2026-10-18T21:46:30Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Index GE-BUG-059&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Classic bug database&#039;&#039;&#039; indexes defects and implementation traps in the original &#039;&#039;Galactic Empire&#039;&#039; source. It is a reference for players investigating classic behavior and developers maintaining or porting the game. Each published record has a stable ID and its own page. See [[Classic bug record format]] for how records are documented.&lt;br /&gt;
&lt;br /&gt;
== Published records ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Record !! Area&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-001 || [[Classic bug: Cargo weight overflow]] || Numeric/cargo&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-002 || [[Classic bug: Cross-user planet cache corruption]] || Multiplayer/memory&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-003 || [[Classic bug: Axis-aligned bearing errors]] || Navigation/geometry&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-004 || [[Classic bug: Planetary ion cannon off-by-one]] || Planet combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-005 || [[Classic bug: Channel-zero NPC targeting]] || NPC/multiplayer&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-006 || [[Classic bug: NPC class slot crowding]] || NPC/configuration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-007 || [[Classic bug: Cash and counter wraparound]] || Numeric/economy&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-008 || [[Classic bug: Flux subtraction underflow]] || Numeric/energy&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-009 || [[Classic bug: Galactic perimeter edge errors]] || Navigation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-010 || [[Classic bug: Wormhole projectile cleanup]] || Combat/navigation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-011 || [[Classic bug: Skipped planetary updates]] || Planets/scheduler&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-012 || [[Classic bug: Planet record-limit failure]] || Database/planets&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-013 || [[Classic bug: Stale NPC database records]] || NPC/database&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-014 || [[Classic bug: Team state inconsistency]] || Teams/database&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-015 || [[Classic bug: Reused deleted team identifiers]] || Teams/planets&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-016 || [[Classic bug: Stationary Cyber-Base movement]] || NPC/navigation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-017 || [[Classic bug: Damaged Cybertron target-flee ordering]] || NPC/combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-018 || [[Classic bug: NPC speed exceeds class limits]] || NPC/navigation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-019 || [[Classic bug: Planet-owner PRICE display]] || Economy/display&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-020 || [[Classic bug: Stale scantab and lock state]] || Sensors/multiplayer&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-021 || [[Classic bug: Torpedo stalls at distance one]] || Combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-022 || [[Classic bug: Ship-selection output overflow]] || Memory/UI&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-023 || [[Classic bug: Phaser spread bias]] || Combat/numeric&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-024 || [[Classic bug: Men do not consume food]] || Planets/economy&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-025 || [[Classic bug: Phaser durability uses cargo capacity]] || Combat/balance&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-026 || [[Classic bug: Damaged warp overrides requested speed]] || Navigation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-027 || [[Classic bug: Fixed-width display column overflow]] || User interface/configuration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-028 || [[Classic bug: Invalid WARP heading reports helm damage]] || Navigation/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-029 || [[Classic bug: Planet spy attack result inversion]] || Planet combat/spies&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-030 || [[Classic bug: Empty-planet troop conquest]] || Planet combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-031 || [[Classic bug: Extended BUY token executes PRICE]] || Commands/economy&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-032 || [[Classic bug: Planet name limit off by one]] || Planets/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-033 || [[Classic bug: Revolt troop losses are reversed]] || Planets/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-034 || [[Classic bug: Disabled production repeats maximum-stock notices]] || Planets/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-035 || [[Classic bug: Attacking troop surrender overwrite]] || Planet combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-036 || [[Classic bug: SYS GOTO desynchronizes warp state]] || Navigation/administration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-037 || [[Classic bug: Planet troop anti-fighter probability]] || Planet combat/numeric&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-038 || [[Classic bug: Planet trade-password terminator overrun]] || Planets/memory&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-039 || [[Classic bug: Unterminated team-creation fields]] || Teams/memory&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-040 || [[Classic bug: Planetary troop fire requires defending fighters]] || Planet combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-041 || [[Classic bug: HELP index omits gameplay commands]] || Documentation/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-042 || [[Classic bug: Messages leak ANSI color and intensity]] || Documentation/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-043 || [[Classic bug: Optional menu text file is never closed]] || Resource management/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-044 || [[Classic bug: Maintenance omits cloak repair]] || Ships/maintenance&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-045 || [[Classic bug: MAXPLSE is off by one]] || Configuration/sector generation&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-046 || [[Classic bug: Reports list nonexistent phasers and shields]] || Ships/user interface/configuration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-047 || [[Classic bug: REP SYS omits damaged systems]] || Ships/combat/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-048 || [[Classic bug: SHIELD DOWN bypasses shield repair]] || Ships/combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-049 || [[Classic bug: Replacement systems retain old charge]] || Ships/economy&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-050 || [[Classic bug: Planet conquest bypasses ownership limit]] || Planets/configuration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-051 || [[Classic bug: Negative missile charge]] || Combat/numeric&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-052 || [[Classic bug: NPC zipper uses another ship&#039;s scanner range]] || NPC/combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-053 || [[Classic bug: Self-destruct abort omits count-10 all-clear]] || Combat/notifications&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-054 || [[Classic bug: Rejected mail leaks into output]] || Planets/mail/user interface&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-055 || [[Classic bug: Filtered broadcast suppresses later recipients]] || Multiplayer/messages&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-056 || [[Classic bug: Team maintenance password bypass]] || Teams/planets&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-057 || [[Classic bug: Droid phasers fire straight ahead]] || NPC/combat&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-058 || [[Classic bug: CYBGOLD zero crashes Cybertron creation]] || NPC/configuration&lt;br /&gt;
|-&lt;br /&gt;
| GE-BUG-059 || [[Classic bug: TEAM KICK mail classification]] || Teams/mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Porting and modernization cautions ==&lt;br /&gt;
These are intentional features, design limitations, or integration assumptions in classic GE rather than additional numbered bugs. A port should decide explicitly whether to preserve or change them.&lt;br /&gt;
&lt;br /&gt;
=== Exposed team diagnostics ===&lt;br /&gt;
The undocumented &amp;lt;code&amp;gt;TEAM DUMPITOUT&amp;lt;/code&amp;gt; command prints the team table, including joining passwords and founder secrets, to any player who invokes it. This is a serious information-disclosure risk even though the command does what its diagnostic implementation asks it to do. A modern port should remove it from ordinary player access or restrict it to administrators, as ge-next did with &amp;lt;code&amp;gt;SYS TEAMDUMP&amp;lt;/code&amp;gt;. See [[Team command#Undocumented classic command|Team command]] and [[Sys command]].&lt;br /&gt;
&lt;br /&gt;
=== Frontend data access ===&lt;br /&gt;
Classic &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; is a documented frontend interface, not merely an accidental debug command. Its published, hardcoded access word does not authenticate a client, and its responses include raw combat state and precise scan information that ordinary commands may conceal. Retaining frontend support need not mean retaining those disclosures: define which information a frontend is allowed to receive and enforce the same gameplay checks as other commands. See [[Data command]] and [[GECP]].&lt;br /&gt;
&lt;br /&gt;
=== NPC behavior tied to class names ===&lt;br /&gt;
Classic selects several Droid behavior routines by matching configured ship-class names. Renaming one of those classes in the ship configuration can silently remove its special behavior even when its other settings are unchanged. This is a configuration constraint rather than a broken default installation; a port can use a separate behavior identifier instead. See [[Droids#Classic Galactic Empire|Droids]] and [[Ship class configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Flux-pod loading conventions ===&lt;br /&gt;
Classic checks for automatic pod loading periodically and only below a fixed active-flux threshold, not whenever an action needs more energy. A ship can therefore fail to fire, cloak, or maintain warp despite carrying spare pods. Some of these outcomes are consequences of the original loading design, distinct from the arithmetic fault catalogued as [[Classic bug: Flux subtraction underflow]]. See [[Flux#Why spare pods can fail in classic|Flux]] and [[Flux command]].&lt;br /&gt;
&lt;br /&gt;
=== Registration and database assumptions ===&lt;br /&gt;
Classic stores registration and trial information in concealed records inside its Btrieve files. A port, roster tool, or database converter must distinguish those records from player and planet records; it should also decide how to handle the original board-bound registration mechanism rather than assuming every record is gameplay data. See [[Classic registration and security system]] and [[Database files]].&lt;br /&gt;
&lt;br /&gt;
=== Shared host output state ===&lt;br /&gt;
MajorBBS&#039;s PRF output buffer is shared working state, not a separate buffer for each connected player. A port or emulator that changes when messages are formatted, cleared, or sent can alter who sees a message even when GE&#039;s calls appear unchanged. See [[MajorBBS integration#Output and message resources|MajorBBS integration]] and [[Classic bug: Filtered broadcast suppresses later recipients]] for a separate GE-side defect involving multi-recipient delivery.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Classic bug record format]]&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
* [[Classic Galactic Empire]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Classic bugs]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_TEAM_KICK_mail_classification&amp;diff=2201</id>
		<title>Classic bug: TEAM KICK mail classification</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_TEAM_KICK_mail_classification&amp;diff=2201"/>
		<updated>2026-10-18T21:46:27Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Document inherited TEAM KICK mail-class bug and ge-next 0.3.3 fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-059&lt;br /&gt;
|affected=Classic 3.2e and ge-next through 0.3.2&lt;br /&gt;
|status=Verified in source; corrected in ge-next 0.3.3&lt;br /&gt;
|fixed=ge-next 0.3.3 (16-bit and 32-bit)&lt;br /&gt;
|source=GECMDS.C: cmd_team(); GEFUNCS.C: sendit(), mailscan(), mailread()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
When &amp;lt;code&amp;gt;TEAM KICK&amp;lt;/code&amp;gt; removes a member, it composes a &#039;&#039;Team Membership Revoked&#039;&#039; mail notice but does not set the notice&#039;s mail class. In classic GE and ge-next through 0.3.2, the notice inherits whatever class was last stored in the shared &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; workspace. It may be filed under Distress messages, misfiled under Production reports, or left in a class that the in-game menu cannot open.&lt;br /&gt;
&lt;br /&gt;
== Symptoms and reproduction ==&lt;br /&gt;
# Use the in-game GE mailbox, with an existing team and another player who can be removed from it.&lt;br /&gt;
# Before any event has assigned a class to the shared &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; workspace, use &amp;lt;code&amp;gt;TEAM KICK&amp;lt;/code&amp;gt; to remove that player.&lt;br /&gt;
# The removed player&#039;s main menu can indicate that a message is waiting, while the mail menu shows neither Distress messages nor Production reports as available.&lt;br /&gt;
&lt;br /&gt;
The initial global &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; 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&#039;s saved membership failed.&lt;br /&gt;
&lt;br /&gt;
Classic 3.2e also has a &amp;lt;code&amp;gt;USEGEMSG&amp;lt;/code&amp;gt; option. When mail is routed to the host BBS mailbox instead of GE&#039;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 &amp;lt;code&amp;gt;TEAM&amp;lt;/code&amp;gt; and is unaffected.&lt;br /&gt;
&lt;br /&gt;
== Cause ==&lt;br /&gt;
&amp;lt;code&amp;gt;cmd_team()&amp;lt;/code&amp;gt; sets &amp;lt;code&amp;gt;mail.userid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mail.topic&amp;lt;/code&amp;gt;, then calls &amp;lt;code&amp;gt;sendit()&amp;lt;/code&amp;gt; without assigning &amp;lt;code&amp;gt;mail.class&amp;lt;/code&amp;gt; (classic) or &amp;lt;code&amp;gt;mail.mailclass&amp;lt;/code&amp;gt; (ge-next). &amp;lt;code&amp;gt;sendit()&amp;lt;/code&amp;gt; copies that field to the stored message&#039;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.&lt;br /&gt;
&lt;br /&gt;
== Correction in ge-next 0.3.3 ==&lt;br /&gt;
The 16-bit and 32-bit ge-next &amp;lt;code&amp;gt;TEAM KICK&amp;lt;/code&amp;gt; paths now set &amp;lt;code&amp;gt;mail.mailclass = MAIL_CLASS_DISTRESS&amp;lt;/code&amp;gt; immediately before &amp;lt;code&amp;gt;sendit()&amp;lt;/code&amp;gt;. 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.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Mail]]&lt;br /&gt;
* [[Team command]]&lt;br /&gt;
* [[Teams]]&lt;br /&gt;
* [[Classic bug: Team state inconsistency]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Multiplayer state]]&lt;br /&gt;
[[Category:Classic bugs: User interface]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Game_reference&amp;diff=2198</id>
		<title>Game reference</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Game_reference&amp;diff=2198"/>
		<updated>2026-10-18T21:39:18Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Mail from game reference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The game reference documents observable rules and mechanics. Articles should state which version they describe whenever behavior differs.&lt;br /&gt;
&lt;br /&gt;
== Systems ==&lt;br /&gt;
* [[Navigation and scanning]]&lt;br /&gt;
* [[Combat]]&lt;br /&gt;
* [[Hull damage]]&lt;br /&gt;
* [[System damage]]&lt;br /&gt;
* [[Maintenance]]&lt;br /&gt;
* [[Economy and cargo]]&lt;br /&gt;
* [[Planets]]&lt;br /&gt;
* [[Mail]]&lt;br /&gt;
* [[Scoring and rosters]]&lt;br /&gt;
* [[Teams]]&lt;br /&gt;
&lt;br /&gt;
== Objects and actors ==&lt;br /&gt;
* [[Ships]]&lt;br /&gt;
* [[Ship upgrades]] (ge-next only)&lt;br /&gt;
* [[Items]]&lt;br /&gt;
* [[Cybertrons]]&lt;br /&gt;
* [[Droids]] (other NPCs)&lt;br /&gt;
* [[Wormholes]]&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
* [[Commands]]&lt;br /&gt;
* [[Glossary]]&lt;br /&gt;
* [[Game timing]]&lt;br /&gt;
* [[Coordinate system]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Maintenance_command&amp;diff=2192</id>
		<title>Maintenance command</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Maintenance_command&amp;diff=2192"/>
		<updated>2026-10-18T21:04:09Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Explain team maintenance bypass before 0.3.3 fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;MAINTENANCE&#039;&#039;&#039; command hires a planetary maintenance crew to repair the current ship while it remains in orbit. The command may be abbreviated to &amp;lt;code&amp;gt;MAI&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MAINTENANCE [password]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An ordinary planet trade password must be supplied directly after the command; the game does not open a separate password prompt. The special password &amp;lt;code&amp;gt;team&amp;lt;/code&amp;gt; is intended to limit access to members of the planet owner&#039;s team. Classic GE and ge-next through 0.3.2 instead treat it as a literal word in &amp;lt;code&amp;gt;MAINTENANCE&amp;lt;/code&amp;gt;: a nonmember can enter &amp;lt;code&amp;gt;MAINT team&amp;lt;/code&amp;gt; and receive service despite the team restriction. See [[Classic bug: Team maintenance password bypass]]. Since ge-next 0.3.3, the command checks membership instead; a team member can request maintenance without supplying a password, and a nonmember cannot bypass the restriction by entering &amp;lt;code&amp;gt;team&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Where maintenance is available ==&lt;br /&gt;
&lt;br /&gt;
The ship must be in stationary orbit. In sector 0 0, Zygor and Tahanian Station provide maintenance for 2,500 cash. The Enforcer Planet does not provide repair service.&lt;br /&gt;
&lt;br /&gt;
Outside the [[Neutral zone|neutral zone]], a claimed planet establishes a repair facility when it has at least 25,000 men. Service there costs 200 cash. The facility does not have to belong to the player requesting repairs. Ordinary trade passwords must be supplied if set; access to a team-restricted planet differs by game version as explained below.&lt;br /&gt;
&lt;br /&gt;
The complete fee is charged when maintenance begins. There is no partial refund if the work is interrupted.&lt;br /&gt;
&lt;br /&gt;
== Restrictions ==&lt;br /&gt;
&lt;br /&gt;
Maintenance will not begin while the ship is considered engaged in hostilities. Weapon fire and damaging another ship set a combat timer used by several game systems; maintenance crews refuse service until that timer has expired.&lt;br /&gt;
&lt;br /&gt;
If a ship becomes hostile or is attacked after maintenance begins, the crew stops work. Leaving orbit also cancels maintenance. The ship keeps whatever repair progress has already occurred, but must pay again to restart the job.&lt;br /&gt;
&lt;br /&gt;
Classic lowers and completely discharges shields when maintenance finishes, regardless of whether the shields were damaged, down, or operating normally. It does not repair cloak damage at all. ge-next leaves undamaged shields alone and includes cloak damage in maintenance, but a cloaked ship cannot begin maintenance unless the ship&#039;s owner also owns the planet.&lt;br /&gt;
&lt;br /&gt;
Issuing &amp;lt;code&amp;gt;MAINTENANCE&amp;lt;/code&amp;gt; again while work is already underway does not restart the job or charge another fee in ge-next. Classic does not have this guard: repeating the command charges the fee again and replaces its repair counter.&lt;br /&gt;
&lt;br /&gt;
== Classic Galactic Empire ==&lt;br /&gt;
&lt;br /&gt;
Classic bases maintenance duration only on structural damage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
warsptr-&amp;gt;repair = (unsigned)(warsptr-&amp;gt;damage / 3.0) + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The resulting number is displayed as &amp;quot;[[Centock|centocks]].&amp;quot; Maintenance is actually processed by the ship-state update, which normally runs every six seconds. The displayed count is therefore neither a real-world number of seconds nor a complete count of all work required.&lt;br /&gt;
&lt;br /&gt;
Each maintenance update removes three points of structural damage. Individual system damage does not lengthen the estimate. When the hull-derived counter reaches its completion threshold, classic immediately resets the hull and a fixed list of systems, then announces that all maintenance is complete.&lt;br /&gt;
&lt;br /&gt;
This has several consequences:&lt;br /&gt;
&lt;br /&gt;
* Damaged systems are not repaired progressively; most remain unavailable until the final update.&lt;br /&gt;
* System damage alone does not produce a longer maintenance time.&lt;br /&gt;
* The cloaking device is omitted from the final reset and can remain damaged after the completion announcement. See [[Classic bug: Maintenance omits cloak repair]].&lt;br /&gt;
* Shields are lowered and completely discharged regardless of whether they were damaged or operating normally.&lt;br /&gt;
* An undamaged ship can still pay for maintenance. On the next update, the completion block runs and can unnecessarily change its shield state.&lt;br /&gt;
&lt;br /&gt;
The classic help describes service at the player&#039;s own planet or Zygor, but the actual command is less restrictive: any claimed planet with at least 25,000 men can provide service if its password requirements are met. Classic checks even the special planet password &amp;lt;code&amp;gt;team&amp;lt;/code&amp;gt; as literal text, so &amp;lt;code&amp;gt;MAINT team&amp;lt;/code&amp;gt; passes that check for a nonmember. See [[Classic bug: Team maintenance password bypass]].&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
&lt;br /&gt;
ge-next 0.3.3 corrects the [[Classic bug: Team maintenance password bypass|team-password bypass]] described above, matching the [[Buy command|BUY]] membership rule. It validates old team references on the planet before applying that rule. Ordinary passwords are unchanged.&lt;br /&gt;
&lt;br /&gt;
ge-next first checks whether the ship has anything that requires repair. An undamaged ship is told that maintenance is unnecessary and is not charged.&lt;br /&gt;
&lt;br /&gt;
During paid maintenance, every six-second ship-state update performs work in three areas concurrently:&lt;br /&gt;
&lt;br /&gt;
* structural damage is reduced by 3 points;&lt;br /&gt;
* damaged shields receive five normal shield-repair steps; and&lt;br /&gt;
* five system-repair steps are applied in priority order.&lt;br /&gt;
&lt;br /&gt;
The system order begins with helm and tactical systems, followed by phasers, torpedo and missile fire control, cloak, jammer, decoy, zipper and mine launchers, and finally warp or overspeed damage. A badly damaged system may consume several steps before work advances to the next system. Messages are shown as individual systems return to service.&lt;br /&gt;
&lt;br /&gt;
The completion estimate is calculated from the outstanding hull, shield, and system work. These categories progress together, so ge-next uses whichever category will take the most update ticks and converts that result to real seconds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ETA = max(hull ticks, shield ticks, system ticks) * 6 seconds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The initial maintenance message and [[Report command|&amp;lt;code&amp;gt;REPORT SYSTEMS&amp;lt;/code&amp;gt;]] therefore show a real-time estimate rather than classic&#039;s centock counter. The estimate may change if the ship suffers more damage or maintenance is interrupted.&lt;br /&gt;
&lt;br /&gt;
ge-next does not announce completion until structural damage, damaged shields, cloak damage, and all other applicable system damage have been cleared. Undamaged shields are left alone, preserving both their operating state and charge. An operational cloak is likewise left in its existing state, although a cloaked ship can only begin maintenance at a planet owned by the same player.&lt;br /&gt;
&lt;br /&gt;
Ships also perform slow passive repairs without hiring a maintenance crew. Paid maintenance replaces those normal rates with the faster rates above. The enhanced damage-control upgrade improves passive repair and exposes additional repair-time information, but paid maintenance already uses its own faster rates.&lt;br /&gt;
&lt;br /&gt;
== ge-arena ==&lt;br /&gt;
&lt;br /&gt;
ge-arena planets may generate either a &#039;&#039;&#039;maintenance depot&#039;&#039;&#039; or an &#039;&#039;&#039;instant maintenance&#039;&#039;&#039; pickup.&lt;br /&gt;
&lt;br /&gt;
At a maintenance depot, &amp;lt;code&amp;gt;MAINTENANCE&amp;lt;/code&amp;gt; starts the same progressive repair process used by ge-next. Arena maintenance costs no cash and does not use planet population or trade passwords. It still cannot begin during the arena combat-lock period, and leaving orbit or renewed hostility interrupts the work.&lt;br /&gt;
&lt;br /&gt;
The standard ge-next hostility lock uses &amp;lt;code&amp;gt;FIRETICKS&amp;lt;/code&amp;gt; 10, normally about 60 seconds across six-second ship-state updates. ge-arena reduces this to 4 ticks, normally about 24 seconds. This keeps a player from repairing during active combat without imposing a one-minute wait in a 15-minute arena match. Some less severe hostile actions use fractions of these values, so the exact remaining wait can be shorter.&lt;br /&gt;
&lt;br /&gt;
Instant maintenance is collected with [[Transfer command|&amp;lt;code&amp;gt;TRANSFER UP&amp;lt;/code&amp;gt;]], not &amp;lt;code&amp;gt;MAINTENANCE&amp;lt;/code&amp;gt;. It repairs all hull and system damage immediately. If the ship does not need repair, the pickup remains on the planet rather than being consumed.&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Behavior&lt;br /&gt;
! Classic Galactic Empire&lt;br /&gt;
! ge-next&lt;br /&gt;
|-&lt;br /&gt;
| Standard fees&lt;br /&gt;
| 2,500 credits at Zygor or Tahanian Station; 200 elsewhere&lt;br /&gt;
| Same&lt;br /&gt;
|-&lt;br /&gt;
| Planet population required outside sector 0 0&lt;br /&gt;
| 25,000 men&lt;br /&gt;
| Same&lt;br /&gt;
|-&lt;br /&gt;
| Duration display&lt;br /&gt;
| Hull-derived centocks&lt;br /&gt;
| Calculated real-world seconds&lt;br /&gt;
|-&lt;br /&gt;
| Systems repaired progressively&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| All applicable damaged systems included&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Undamaged ship refused without charge&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Repeating the command during maintenance refused without charge&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;team&amp;lt;/code&amp;gt; restricts maintenance by membership&lt;br /&gt;
| No; literal &amp;lt;code&amp;gt;MAINT team&amp;lt;/code&amp;gt; passes the password check&lt;br /&gt;
| Yes, since 0.3.3&lt;br /&gt;
|-&lt;br /&gt;
| Visiting cloaked ship refused&lt;br /&gt;
| No&lt;br /&gt;
| Yes, unless the ship owner owns the planet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[MBMGEHLP.MSG#HELP_MAINT|Classic HELP MAINT]]&lt;br /&gt;
* [[Maintenance]]&lt;br /&gt;
* [[Report command]]&lt;br /&gt;
* [[Orbit command]]&lt;br /&gt;
* [[Classic bug: Maintenance omits cloak repair]]&lt;br /&gt;
* [[Classic bug: Team maintenance password bypass]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Flux&amp;diff=2183</id>
		<title>Flux</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Flux&amp;diff=2183"/>
		<updated>2026-10-18T18:51:49Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Clarify classic rotation flux charge and ge-next rationale&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Neutron flux&#039;&#039;&#039; is the energy in a ship&#039;s active pile. Propulsion and several ship systems spend this charge; a carried [[Flux pod]] is a separate inventory item that can replace it. The active pile holds up to 65,000 energy units. [[Report command|&amp;lt;code&amp;gt;REPORT SYSTEMS&amp;lt;/code&amp;gt;]] shows its current charge, while &amp;lt;code&amp;gt;REPORT INVENTORY&amp;lt;/code&amp;gt; shows how many pods remain.&lt;br /&gt;
&lt;br /&gt;
== Energy use ==&lt;br /&gt;
These are stock costs; a configured cloak cost or missile charge can differ. A movement update and a ship-state update are different parts of the game loop, so costs in different rows need not be charged at the same instant.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! System or action !! Classic GE 3.2e !! ge-next&lt;br /&gt;
|-&lt;br /&gt;
| [[Rotate command|ROTATE command]] || 30 when its energy check succeeds; &amp;lt;code&amp;gt;useenergy()&amp;lt;/code&amp;gt; also requires 500 energy to remain afterward. || No separate rotation charge.&lt;br /&gt;
|-&lt;br /&gt;
| Impulse movement || No ordinary movement-energy charge at impulse speed. || 1 per powered movement update.&lt;br /&gt;
|-&lt;br /&gt;
| Warp acceleration || 120 for a charged acceleration step. || 120 for a warp-range acceleration step; entering hyperspace also reserves enough flux for the accompanying movement check.&lt;br /&gt;
|-&lt;br /&gt;
| Warp movement || 10 per movement update only above warp 1.00; at exactly 1.00 the classic code skips this charge. The requested speed is cut when the active pile falls below 3,000 during a charged movement update. || 10 plus the whole-number warp speed per powered movement update: 11 at warp 1, 20 at warp 10.&lt;br /&gt;
|-&lt;br /&gt;
| Standard phaser firing || Spends stored phaser charge, not flux directly. || Same; the later recharge spends flux.&lt;br /&gt;
|-&lt;br /&gt;
| Phaser recharge || 57 per ship-state update while a working phaser is below full charge; the classic &amp;lt;code&amp;gt;useenergy()&amp;lt;/code&amp;gt; check requires 500 more than the cost. || 57 per recharge update, checked against available active charge or a pod.&lt;br /&gt;
|-&lt;br /&gt;
| Hyper-phaser firing || Spends 5,000 but requires at least 6,000 active energy before firing. || Spends 5,000; the shared loader checks that amount first.&lt;br /&gt;
|-&lt;br /&gt;
| Missile launch || Uses charged missile energy divided by &amp;lt;code&amp;gt;MISENGFC&amp;lt;/code&amp;gt;, stock 100: a 50,000-energy missile costs 500 flux. || Uses the entire selected 2,000–20,000-energy charge as flux.&lt;br /&gt;
|-&lt;br /&gt;
| Raised shields || Normally 100 times the installed shield Mark per ship-state update: Mark-5 costs 500. || The same Mark-based upkeep, but checked against available active charge or a pod before charging.&lt;br /&gt;
|-&lt;br /&gt;
| Cloak upkeep || &amp;lt;code&amp;gt;CLENGUSE&amp;lt;/code&amp;gt; per ship-state update, stock 7,500. || &amp;lt;code&amp;gt;CLENGUSE&amp;lt;/code&amp;gt; per ship-state update, stock 5,000; the shared loader checks for a pod first.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Classic charges for issuing &amp;lt;code&amp;gt;ROTATE&amp;lt;/code&amp;gt;, not for the physical turn performed later. &amp;lt;code&amp;gt;IMPULSE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARP&amp;lt;/code&amp;gt; can set a new heading without paying that 30-unit charge, and the subsequent turn also costs no flux. Conversely, &amp;lt;code&amp;gt;ROTATE&amp;lt;/code&amp;gt; can charge even when the requested heading is unchanged; in its absolute-heading path, it charges before rejecting an out-of-range value such as &amp;lt;code&amp;gt;ROTATE @360&amp;lt;/code&amp;gt;. This command-dependent inconsistency was one reason ge-next removed the separate rotation charge.&lt;br /&gt;
&lt;br /&gt;
Background recharge adds one unit per ship-state update in classic and two in ge-next. This is far slower than the main costs of combat or warp travel. The costs above describe normal player use. In both classic GE and ge-next, an active Cybertron or Droid has its flux set back to 50,000 at the end of each AI behavior callback, rather than depending on carried pods to remain powered. These ships still carry flux pods as inventory and potential salvage; the shared energy check can occasionally consume one between AI callbacks, but the recurring reset keeps an NPC from staying powerless merely because it has run out of pods.&lt;br /&gt;
&lt;br /&gt;
== Why spare pods can fail in classic ==&lt;br /&gt;
Classic checks for automatic pod loading once near the start of each ship-state pass, and only if active flux is &#039;&#039;below&#039;&#039; 5,000. Other energy-using routines do not call that loader when an action needs more charge. The timing and thresholds can therefore disagree:&lt;br /&gt;
&lt;br /&gt;
* At 5,500 flux, a ship with spare pods cannot fire its hyper-phaser: firing requires 6,000, but the periodic loader will not load a pod until the pile falls below 5,000.&lt;br /&gt;
* At 6,000 flux, a successful hyper-phaser shot spends 5,000 and leaves 1,000. If the next movement update runs before the pod-loading status pass, the ship can lose its requested warp speed because its charge is below the 3,000 movement threshold, despite having pods aboard.&lt;br /&gt;
* With 8,000 flux and raised Mark-6 shields, the classic status pass skips pod loading, then shield upkeep takes 600. Cloak upkeep later in that pass requires the stock 7,500 and shuts off the cloak at 7,400, although a spare pod is present.&lt;br /&gt;
* An immediate rotation or a phaser recharge attempt can also fail or stall at low charge between periodic checks. The pod will not be considered until a later status pass.&lt;br /&gt;
&lt;br /&gt;
Classic can also subtract flux unsafely in some paths when no pod is available; see [[Classic bug: Flux subtraction underflow]]. These are separate arithmetic faults from the missed-reload cases above.&lt;br /&gt;
&lt;br /&gt;
== ge-next loading ==&lt;br /&gt;
Since ge-next 0.2, &amp;lt;code&amp;gt;fluxstat()&amp;lt;/code&amp;gt; receives the amount an operation needs. If the active pile cannot cover it, the routine consumes one available pod and replaces the pile with 65,000 units &#039;&#039;before&#039;&#039; the operation proceeds. Movement, phaser recharge, hyper-phaser and missile firing, and shield/cloak upkeep use this shared check. The remaining energy in the old pile is not added to the replacement charge. If there is no pod, the system follows its insufficient-power path instead. This eliminates the classic timing gaps above and makes the manual [[Flux command|FLUX command]] unnecessary for normal operation.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Flux pod]]&lt;br /&gt;
* [[Flux command]]&lt;br /&gt;
* [[Warp travel]]&lt;br /&gt;
* [[Hyper-phasers]]&lt;br /&gt;
* [[Missiles]]&lt;br /&gt;
* [[Shields]]&lt;br /&gt;
* [[Cloaking]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Game reference]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Lydorian_Garbage_Scow&amp;diff=2182</id>
		<title>Lydorian Garbage Scow</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Lydorian_Garbage_Scow&amp;diff=2182"/>
		<updated>2026-10-18T18:37:58Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Distinguish defined and reachable classic Scow hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Lydorian Garbage Scow&#039;&#039;&#039; is the smallest, least aggressive [[Droids|Droid]] in both classic &#039;&#039;Galactic Empire&#039;&#039; and ge-next. Its low point value and central starting area make it an early encounter rather than a serious combatant.&lt;br /&gt;
&lt;br /&gt;
== Classic GE ==&lt;br /&gt;
The stock class is &#039;&#039;&#039;NCC Lx4&#039;&#039;&#039;, with Mark-1 shields and phasers, a 25,000-distance-unit scanner, and a five-point kill value. Its class table lists warp 1 and several secondary-system permissions, but its dedicated behavior does not use those weapons or enter ordinary warp travel. It can carry some supplies, but carrying them does not mean its AI uses them.&lt;br /&gt;
&lt;br /&gt;
The Scow notices and occasionally hails a player within its scanner range. It raises shields while moving at impulse speed. If jammed, it requests a near-warp impulse speed and holds course for a while. Even when attacked, the classic routine has no retaliatory shot, target pursuit, or damage-triggered retreat. Its installed phaser is therefore not a practical threat. See [[Classic NPC ship classes]] for the complete shipped class settings.&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
The stock class becomes &#039;&#039;&#039;NCC Lx5&#039;&#039;&#039;, with no phaser capability, warp 0, Mark-1 maximum shields, and a 20,000-distance-unit scanner. Newly created Scows appear relatively close to the center of the galaxy. They hail visible player ships only when each ship is within the other&#039;s scanner range.&lt;br /&gt;
&lt;br /&gt;
The Scow still does not fire. Unlike the classic version, it can respond to an assigned attacker by turning directly away and requesting its maximum impulse speed; it resumes ordinary cruising when the threat is gone. Jamming disrupts that response. At impulse speed it keeps shields raised when they are functional, and an attacked Scow can send a [[Droids#Factions and distress in ge-next|distress call]]. Its avoidance makes it less of a stationary target without turning it into a combat ship. See [[ge-next NPC ship classes]] for its configured limits.&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
Classic GE&#039;s message file defines five Scow beacons about hazardous cargo, treaty protection, and approach clearance. However, the published 3.2e Scow routine calls &amp;lt;code&amp;gt;droid_annoy()&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;DRDMSG6&amp;lt;/code&amp;gt; as both the first and last message, so only the hazardous-material warning is selected by that code. ge-next uses several rotating beacons and adds wary hails for players disliked by the Lydorians. After an attack, the Scow asks the player to stop or spare a vessel carrying nothing valuable. These are warnings and pleas, not threats backed by Scow weapons. A ge-next distress call is separate from these hails.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]] and [[Droids#Factions and distress in ge-next|faction rules]]&lt;br /&gt;
* [[Murdonian Transport]] and [[Vakory Survey Drone]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Galactic_Command_Freighter&amp;diff=2181</id>
		<title>Galactic Command Freighter</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Galactic_Command_Freighter&amp;diff=2181"/>
		<updated>2026-10-18T18:35:39Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Summarize class-specific Droid hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Galactic Command Freighter&#039;&#039;&#039; is a ge-next [[Droids|Droid]] belonging to the Zygorian/Galactic Command [[Droids#Factions and distress in ge-next|faction]]. Its distinctive behavior is a supply voyage to [[Zygor]], with defensive combat if that voyage is threatened. There is no corresponding classic Droid class.&lt;br /&gt;
&lt;br /&gt;
== ge-next behavior ==&lt;br /&gt;
The stock &#039;&#039;&#039;Zygor-&#039;&#039;&#039; class has maximum Mark-12 shields, Mark-10 phasers, warp 25, a 150,000-distance-unit scanner, a 500-point kill value, and exceptionally large cargo capacity. A new freighter can carry gold and assorted supplies, and is normally generated within roughly half the galaxy radius on each axis.&lt;br /&gt;
&lt;br /&gt;
Freighters coordinate a recurring trip to sector &amp;lt;code&amp;gt;0 0&amp;lt;/code&amp;gt;. Normally one enters the travel-and-resupply sequence at a time, although a freighter with more than 50 hull damage can join it for repair. It steers toward the center, progressively slows, and stops within orbit range of Zygor. While stopped, it repairs hull damage in increments, pauses briefly, replenishes its cargo, then departs and travels outward before another freighter takes the scheduled turn. This is scripted NPC behavior, not a player-operated trade or [[Maintenance command|maintenance]] transaction. The routine even prevents helm damage from derailing its route.&lt;br /&gt;
&lt;br /&gt;
If attacked away from the neutral zone, the freighter steers roughly away and uses defensive phasers and torpedoes against a visible nearby target. It can also release decoys, activate a jammer, or use a zipper when the attacker is near mines and equipment is available. At 33 or more hull damage it tries a faster escape rather than a slower impulse withdrawal. It can send a distress call. Offensive fire is suppressed in the [[neutral zone]], where its Zygor visit takes place. See [[ge-next NPC ship classes]] for the stock equipment and [[Droids#Factions and distress in ge-next|Droid distress]] for rescue consequences.&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
Its routine messages are promotional beacons for Zygor&#039;s ships and supplies and for Tahanian Station. A player regarded as hostile by Galactic Command receives warnings to keep away instead. When attacked, the Freighter protests and may say the attacker is no longer welcome at Zygor. That line does not itself bar trade: Zygor&#039;s actual refusal depends on the player&#039;s faction dislike. The Freighter can also send a separate distress call.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]], [[Zygor]], [[Droids#Factions and distress in ge-next|faction rules]], and [[Gold]]&lt;br /&gt;
* [[Murdonian Transport]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Sarten_Defense_Drone&amp;diff=2180</id>
		<title>Sarten Defense Drone</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Sarten_Defense_Drone&amp;diff=2180"/>
		<updated>2026-10-18T18:35:36Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Summarize class-specific Droid hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Sarten Defense Drone&#039;&#039;&#039; is ge-next&#039;s active Sarten patrol ship and a [[Droids|Droid]] rather than a Cybertron. It is not the same class or AI as classic GE&#039;s Cybertron-type Sarten Attack Drone. Unlike a civilian transport, this ship can select a target before it is attacked.&lt;br /&gt;
&lt;br /&gt;
== ge-next behavior ==&lt;br /&gt;
The stock &#039;&#039;&#039;SDDx2&#039;&#039;&#039; has maximum Mark-6 shields, Mark-10 phasers, warp 50, a 250,000-distance-unit scanner, and a 100-point kill value. Its acceleration is comparatively low. Newly generated patrols tend to appear farther from the center in sufficiently large galaxies.&lt;br /&gt;
&lt;br /&gt;
An unassigned patrol can choose a nearby player whose Sarten [[Droids#Factions and distress in ge-next|dislike]] exceeds 50, provided that player&#039;s class meets the configured minimum and another Defense Drone has not already claimed them. Depending on the Cybertron-attack setting, it can instead select an idle Cybertron. It hails nearby players, but does not need to wait to be damaged before it starts pursuing an eligible target.&lt;br /&gt;
&lt;br /&gt;
The Drone uses fast travel to close large distances, drops toward impulse as it approaches, and makes close combat passes rather than simply stopping on top of a target. It can use phasers and torpedoes at suitable range, lay a mine during a very close pass, then turn away and accelerate. If the target is near mines, it may use a zipper. These attacks depend on range, visibility, stock, reload state, and neutral-zone restrictions. If the target becomes invisible, the pursuit can eventually be abandoned; jamming can disrupt its normal target handling. Its routine does not use the civilian Droid distress-call path. See [[ge-next NPC ship classes]] for full class settings.&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
The patrol&#039;s routine beacons identify its defensive mission, warn ships not to interfere, and invite help against Cybertrons. To a player with hostile Sarten standing, it sends accusations or warnings instead. If attacked, it responds with condemnations of the player&#039;s actions. Unlike civilian Droids, the Defense Drone does not use the distress-call path.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]], [[Droids#Factions and distress in ge-next|faction rules]], [[Mines]], and [[Zippers]]&lt;br /&gt;
* [[Sarten Civil Transport]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Sarten_Civil_Transport&amp;diff=2179</id>
		<title>Sarten Civil Transport</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Sarten_Civil_Transport&amp;diff=2179"/>
		<updated>2026-10-18T18:35:32Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Summarize class-specific Droid hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Sarten Civil Transport&#039;&#039;&#039; is a ge-next [[Droids|Droid]] introduced with the expanded non-Cybertron population. It belongs to the [[Droids#Factions and distress in ge-next|Sarten faction]] and is a defensive civilian ship, not a dedicated pursuer. It is distinct from classic GE&#039;s Sarten Attack Drone and Sarten Obliterator, which were [[Cybertrons|Cybertron-type]] ships rather than Droids.&lt;br /&gt;
&lt;br /&gt;
== ge-next behavior ==&lt;br /&gt;
The stock &#039;&#039;&#039;SCTx7&#039;&#039;&#039; has maximum Mark-8 shields, Mark-6 phasers, warp 10, a 50,000-distance-unit scanner, and a 200-point kill value. New transports start comparatively close to the galactic center and may carry a modest amount of gold. They hail visible player ships when the ships are within mutual scanner range.&lt;br /&gt;
&lt;br /&gt;
If attacked, the transport faces roughly away from the attacker and alternates between impulse evasions and faster cruising; when its target is obscured in a nebula, it can favor impulse maneuvering. It can fire phasers at a visible target within roughly 30,000 distance units. At impulse it may release decoys, and it may jam a nearby attacker when the jammer is stocked and ready. It has no torpedo or missile launchers. Like other non-combat transports, it may issue a distress call, so a player can become involved in a Sarten encounter without having initiated the attack. It does not actively search for disliked players to pursue. See [[ge-next NPC ship classes]] for its configured equipment and [[Droids#Factions and distress in ge-next|Droid distress]] for the broader rescue rules.&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
Its approach messages describe civilian passengers, flight from Cybertrons, and a wish for peace with other species. A player disliked by the Sartens instead hears warnings about previous attacks on Sarten vessels. When fired upon, the Transport protests and may say it will summon defense drones; that line is dialogue, not a command that immediately creates a patrol. A separate distress message can ask nearby players for help.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]], [[Droids#Factions and distress in ge-next|faction rules]], [[Decoys]], and [[Jamming]]&lt;br /&gt;
* [[Sarten Defense Drone]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Vakory_Survey_Drone&amp;diff=2178</id>
		<title>Vakory Survey Drone</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Vakory_Survey_Drone&amp;diff=2178"/>
		<updated>2026-10-18T18:35:29Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Summarize class-specific Droid hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Vakory Survey Drone&#039;&#039;&#039; is the most combat-capable of the three classic &#039;&#039;Galactic Empire&#039;&#039; [[Droids|Droids]]. It surveys and hails rather than proactively hunting players, but an attack can provoke weapons fire and evasive action.&lt;br /&gt;
&lt;br /&gt;
== Classic GE ==&lt;br /&gt;
The stock &#039;&#039;&#039;Vakory SD-82&#039;&#039;&#039; has Mark-1 shields and phasers, warp 4, a 25,000-distance-unit scanner, and a 50-point kill value. It notices nearby player ships and may hail them. Once attacked, it can use standard phasers at impulse or hyper-phasers while both ships are at warp. Its impulse phaser sweep points straight ahead, not necessarily at the attacker; see [[Classic bug: Droid phasers fire straight ahead]].&lt;br /&gt;
&lt;br /&gt;
The classic routine also attempts torpedo fire: it temporarily stocks torpedoes and calls the launcher directly, despite the class table saying &#039;&#039;no&#039;&#039; to torpedo capability. The direct launcher path does not check that class flag. The attempt remains subject to other requirements, including obtaining a lock and a free incoming-torpedo slot. The Drone can vary its speed and heading, accelerate to shake an attached missile, and, above 75 hull damage, try to lay a mine, activate a jammer, and run at its maximum requested speed on a random heading. Thus its retreat is both evasive and hazardous to a pursuer. Its attack/retreat branch also requires a positive &amp;lt;code&amp;gt;lastfired&amp;lt;/code&amp;gt; channel, so a channel-zero attacker can fail to trigger it; see [[Classic bug: Channel-zero NPC targeting]]. See [[Classic NPC ship classes]].&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
The stock &#039;&#039;&#039;Vakory SD-86&#039;&#039;&#039; retains maximum Mark-1 shields and phasers and warp 4, but now has two torpedo launchers and explicit mine and jammer capability. Unlike the centrally concentrated classic Drone, a newly created one can appear throughout the galaxy.&lt;br /&gt;
&lt;br /&gt;
When attacked, it turns roughly away from its attacker. Below 67 hull damage it varies its impulse speed; at or above that threshold it tries to escape faster and may leave a mine. Against a visible nearby target it can fire an aimed phaser or torpedo, and may jam when its equipment is ready. Its torpedo use now follows the configured launcher count, stock, visibility, speed, and neutral-zone rules instead of relying on the classic direct-call quirk. It can send a distress call. Heavy jamming interferes with its normal response. See [[ge-next NPC ship classes]].&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
In classic GE, the Drone occasionally announces treaty protection or its automatic defenses, and an attacked Drone may call for help or report the attack to Vakory High Command. ge-next separates routine approach beacons from warnings to players the Vakories regard as hostile and responses to a fresh attack. Its messages present the ship as an unmanned research vessel and warn that its defenses are active. The ge-next distress broadcast is a separate gameplay message, not merely one of these hails.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]], [[Torpedoes]], [[Mines]], and [[Jamming]]&lt;br /&gt;
* [[Murdonian Transport]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Murdonian_Transport&amp;diff=2177</id>
		<title>Murdonian Transport</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Murdonian_Transport&amp;diff=2177"/>
		<updated>2026-10-18T18:35:26Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Summarize class-specific Droid hails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Murdonian Transport&#039;&#039;&#039; is a cargo-carrying [[Droids|Droid]] in classic &#039;&#039;Galactic Empire&#039;&#039; and ge-next. It is not a roaming hunter: an encounter or attack causes it to slow, defend itself, or evade, rather than deliberately seek players to fight.&lt;br /&gt;
&lt;br /&gt;
== Classic GE ==&lt;br /&gt;
The stock &#039;&#039;&#039;Trans-Gal #2&#039;&#039;&#039; has Mark-2 shields, Mark-5 phasers, warp 8, a 25,000-distance-unit scanner, and a 200-point kill value. It may start with a broad assortment of cargo, including goods that it cannot launch as weapons. Its behavior is distinct from the smaller Scow: when a player approaches, it requests an impulse speed, raises shields at impulse, and may hail the player.&lt;br /&gt;
&lt;br /&gt;
After being attacked, it can answer with phasers at impulse or hyper-phasers when both ships are at warp. At impulse, its classic routine fires straight along its current heading rather than aiming at the attacker; see [[Classic bug: Droid phasers fire straight ahead]]. The shot can still hit a ship in that narrow forward arc. It may also change heading and speed unpredictably. If a missile is attached while it is at warp, it requests a drop to impulse. Jamming makes it request maximum warp and hold course. It does not launch the torpedoes or missiles that may be present in its cargo, and it has no explicit hull-damage threshold that triggers a dedicated retreat. See [[Classic NPC ship classes]].&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
The stock &#039;&#039;&#039;Trans-Gal #3&#039;&#039;&#039; can carry substantially more cargo, with maximum Mark-4 shields and Mark-10 phasers, warp 8, and a 50,000-distance-unit scanner. Its starting inventory may include goods, gold, and weapons as cargo, but the class has no projectile launchers. It commonly cruises until a player comes near, then slows to impulse and hails; when alone, it resumes its route.&lt;br /&gt;
&lt;br /&gt;
When an attacker is assigned, the Transport steers roughly away from the attacker and can fire an aimed standard or hyper-phaser if the target is visible and close enough. At more than 50 hull damage it switches from a modest impulse escape to a faster cruise. It does not fire torpedoes or missiles. It can call for help, and its response is affected by jamming, visibility, and damage to its systems. Its defensive fire is more deliberately aimed than in classic but is still secondary to escaping with its cargo. See [[ge-next NPC ship classes]] and [[Droids#Factions and distress in ge-next|faction rules]].&lt;br /&gt;
&lt;br /&gt;
== Hails ==&lt;br /&gt;
Classic&#039;s Transport sends occasional warnings about its cargo, clearance, and Murdonian law. When attacked, it may object to the aggression or transmit a plea for assistance; these classic pleas are message text, not ge-next&#039;s rescue mechanism. ge-next adds distinct approach beacons, hostile-standing warnings, and attack reactions. They emphasize Murdonian Imperial authority, the civilian passengers, and the Transport&#039;s right to defend itself. A ge-next distress broadcast is separate from its ordinary hails.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Droids]] and [[Gold]]&lt;br /&gt;
* [[Lydorian Garbage Scow]] and [[Vakory Survey Drone]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:NPCs]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_Filtered_broadcast_suppresses_later_recipients&amp;diff=2175</id>
		<title>Classic bug: Filtered broadcast suppresses later recipients</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_Filtered_broadcast_suppresses_later_recipients&amp;diff=2175"/>
		<updated>2026-10-18T18:24:06Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link bug discovery transcript&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-055&lt;br /&gt;
|affected=Classic Galactic Empire 3.2e and published classic source; standard ge-next builds through 0.3.1&lt;br /&gt;
|status=Verified in source; reproduced in multiplayer testing before correction&lt;br /&gt;
|fixed=ge-next 0.3.2&lt;br /&gt;
|source=&amp;lt;code&amp;gt;outprfge()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;outwar()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;outsect()&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;outrange()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;cmd_send()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GECMDS.C&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
Classic GE can suppress a &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt;-class broadcast for players who have not enabled filtering. When one eligible recipient has &amp;lt;code&amp;gt;SET FILTER ON&amp;lt;/code&amp;gt;, rejecting that message clears the shared print buffer. The broadcast continues to higher-numbered user slots, but the text has already been erased. Earlier eligible recipients can receive the message; later ones cannot. This is not an intended effect of the later players&#039; own settings.&lt;br /&gt;
&lt;br /&gt;
== Reproduction ==&lt;br /&gt;
# Have three players in GE on user slots 0, 1, and 2. Player 0 is the sender. Player 1 enters &amp;lt;code&amp;gt;SET FILTER ON&amp;lt;/code&amp;gt;; player 2 leaves &amp;lt;code&amp;gt;SET FILTER OFF&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Player 0 tunes one classic A/B/C preset to &amp;lt;code&amp;gt;HAIL&amp;lt;/code&amp;gt; and sends a public message with, for example, &amp;lt;code&amp;gt;SEND A test&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Player 1 correctly does not receive the filtered hail. Player 2 also does not receive it, despite filtering being off.&lt;br /&gt;
# If player 1 turns filtering off and the sender repeats the hail, player 2 receives it. A recipient visited &#039;&#039;before&#039;&#039; the filtered player is unaffected.&lt;br /&gt;
&lt;br /&gt;
The same failure pattern can occur for other &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt;-class messages distributed through a sector or scanner-range broadcast. It does not apply to every message: calls marked &amp;lt;code&amp;gt;ALWAYS&amp;lt;/code&amp;gt; are not rejected by this setting, and a recipient must otherwise qualify for that particular broadcast.&lt;br /&gt;
&lt;br /&gt;
== Cause ==&lt;br /&gt;
Classic broadcast helpers iterate potential recipients in ascending user-slot order, calling &amp;lt;code&amp;gt;outprfge()&amp;lt;/code&amp;gt; with the same formatted print buffer. For a &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; message whose recipient has filtering enabled, &amp;lt;code&amp;gt;outprfge()&amp;lt;/code&amp;gt; calls &amp;lt;code&amp;gt;clrprf()&amp;lt;/code&amp;gt; rather than sending the text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if (class == FILTER &amp;amp;&amp;amp; warusroff(shpno)-&amp;gt;options[MSG_FILTER] == TRUE) {&lt;br /&gt;
    clrprf();&lt;br /&gt;
    return;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That clears the message for the &#039;&#039;whole ongoing broadcast&#039;&#039;, not just this recipient. The loop in &amp;lt;code&amp;gt;outwar()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;outsect()&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;outrange()&amp;lt;/code&amp;gt; still visits later eligible slots, but their output calls no longer have the original message to send. A public hail from classic &amp;lt;code&amp;gt;SEND A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SEND B&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;SEND C&amp;lt;/code&amp;gt; when that preset is set to &amp;lt;code&amp;gt;HAIL&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;outwar(FILTER, ...)&amp;lt;/code&amp;gt;, making the problem visible in ordinary play.&lt;br /&gt;
&lt;br /&gt;
== Correction in ge-next ==&lt;br /&gt;
ge-next 0.3.2 separates individual recipient delivery from buffer cleanup. Its internal &amp;lt;code&amp;gt;sendprfge()&amp;lt;/code&amp;gt; decides whether to send to one recipient without clearing a rejected message. The broadcast helpers use that routine for each eligible recipient and call &amp;lt;code&amp;gt;clrprf()&amp;lt;/code&amp;gt; only after the broadcast loop finishes. The public &amp;lt;code&amp;gt;outprfge()&amp;lt;/code&amp;gt; wrapper still clears after an individual rejected delivery, where no subsequent broadcast recipients depend on the buffer. A recipient&#039;s display settings therefore affect only that recipient.&lt;br /&gt;
&lt;br /&gt;
ge-next uses more specific message categories in place of classic&#039;s single &amp;lt;code&amp;gt;FILTER&amp;lt;/code&amp;gt; switch; that interface change is separate from the shared-buffer correction.&lt;br /&gt;
&lt;br /&gt;
== Discovery transcript ==&lt;br /&gt;
[[Discovery transcript: GE-BUG-055|Read the multiplayer observation that revealed the broadcast-filter failure]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Set command]]&lt;br /&gt;
* [[Send command]]&lt;br /&gt;
* [[MajorBBS integration]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Multiplayer state]]&lt;br /&gt;
[[Category:Classic bugs: User interface]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_Phaser_spread_bias&amp;diff=2174</id>
		<title>Classic bug: Phaser spread bias</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_Phaser_spread_bias&amp;diff=2174"/>
		<updated>2026-10-18T18:24:00Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link bug discovery transcript&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-023&lt;br /&gt;
|affected=Classic 3.2e and published classic source&lt;br /&gt;
|status=Verified mathematically and in source&lt;br /&gt;
|fixed=ge-next 0.3&lt;br /&gt;
|source=GECMDS.C: firep() and firehp(); GEFUNCS.C: valpcnt() and pdamage(); GELIB.C: smallest()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
Classic converts the phaser&#039;s intended firing direction and the direction to each potential target from floating-point angles to unsigned whole degrees by truncating them. Truncation always discards the fractional part instead of rounding to the nearest degree. Near the edge of the beam, this gives the positive-bearing side almost one additional degree of coverage compared with the negative-bearing side.&lt;br /&gt;
&lt;br /&gt;
The phaser does not randomly wander to one side. The bias is deterministic: the same geometry produces the same hit or miss every time.&lt;br /&gt;
&lt;br /&gt;
== Direction and spread ==&lt;br /&gt;
The first argument to [[Phaser command|&amp;lt;code&amp;gt;PHASER&amp;lt;/code&amp;gt;]] is a relative bearing from -180 through +180:&lt;br /&gt;
&lt;br /&gt;
* negative bearings are to port, or left;&lt;br /&gt;
* positive bearings are to starboard, or right; and&lt;br /&gt;
* zero is directly ahead.&lt;br /&gt;
&lt;br /&gt;
The optional second argument is called both “spread” and “focus” in classic&#039;s interface. It accepts values from 0 through 5. If it is omitted, classic uses 1. Despite the name “focus,” increasing the value widens the beam while reducing its damage.&lt;br /&gt;
&lt;br /&gt;
Classic first converts the requested relative direction into an absolute firing direction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
deg = (unsigned)normal(ptr-&amp;gt;heading + (double)ptr-&amp;gt;degrees);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It independently calculates the true direction from the firing ship to every candidate target and truncates that value as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
heading = (unsigned)vector(&amp;amp;ptr-&amp;gt;coord,&amp;amp;wptr-&amp;gt;coord);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A target is inside the beam when the shortest angular distance between those two truncated integers is less than the selected spread plus &amp;lt;code&amp;gt;PHABIAS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define PHABIAS 2&lt;br /&gt;
&lt;br /&gt;
if (smallest(heading,deg) &amp;lt; ptr-&amp;gt;percent + PHABIAS)&lt;br /&gt;
        /* target is in the beam */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;smallest()&amp;lt;/code&amp;gt; correctly treats angles near 0 and 360 as adjacent. The defect occurs before that comparison, when each floating-point angle is truncated toward the lower whole degree.&lt;br /&gt;
&lt;br /&gt;
== Positive-versus-negative example ==&lt;br /&gt;
Consider a stationary ship heading 0 that fires:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
PHASER 0 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The firing direction is straight ahead. Spread 1 plus &amp;lt;code&amp;gt;PHABIAS&amp;lt;/code&amp;gt; 2 produces this strict test:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
angular_difference &amp;lt; 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now place otherwise identical targets at equal fractional bearings on either side of the centerline.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! True relative bearing&lt;br /&gt;
! Angle used by classic&lt;br /&gt;
! &amp;lt;code&amp;gt;smallest()&amp;lt;/code&amp;gt; result&lt;br /&gt;
! Outcome&lt;br /&gt;
|-&lt;br /&gt;
| +2.9 degrees&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| Hit, because 2 is less than 3&lt;br /&gt;
|-&lt;br /&gt;
| -2.9 degrees&lt;br /&gt;
| 357 after normalization and truncation&lt;br /&gt;
| 3&lt;br /&gt;
| Miss, because 3 is not less than 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The positive target is nearly three degrees to starboard but is pulled down into the accepted two-degree bucket. The corresponding negative target is represented near 360 degrees; truncating 357.1 to 357 pushes its complementary distance up to three degrees.&lt;br /&gt;
&lt;br /&gt;
For an integral beam center and a threshold &amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;, classic&#039;s effective coverage is approximately:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-(W - 1) degrees through just under +W degrees&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With the default spread of 1, &amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt; is 3, so the beam covers roughly -2.0 through just under +3.0 degrees. The exact boundary changes when the ship&#039;s own heading has a fractional component, but truncation still quantizes the center and target toward lower absolute angles rather than treating the two sides evenly.&lt;br /&gt;
&lt;br /&gt;
According to classic&#039;s own command documentation, positive relative bearings are starboard and negative bearings are port. The arithmetic therefore favors the positive/starboard edge in the straightforward heading-zero example.&lt;br /&gt;
&lt;br /&gt;
== Effect of the spread setting ==&lt;br /&gt;
The same one-sided boundary appears at every spread setting. The nominal integer comparison is:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Spread&lt;br /&gt;
! Test threshold&lt;br /&gt;
! Accepted integer differences&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| less than 2&lt;br /&gt;
| 0 or 1 degree&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| less than 3&lt;br /&gt;
| 0 through 2 degrees&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| less than 4&lt;br /&gt;
| 0 through 3 degrees&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| less than 5&lt;br /&gt;
| 0 through 4 degrees&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| less than 6&lt;br /&gt;
| 0 through 5 degrees&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| less than 7&lt;br /&gt;
| 0 through 6 degrees&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Spread also feeds into &amp;lt;code&amp;gt;pdamage()&amp;lt;/code&amp;gt;. Before range, phaser charge, phaser class, and target durability are applied, classic calculates a focus factor and squares it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
fd = 1 - ((double)foc / 11);&lt;br /&gt;
damage_factor = fd * fd;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The resulting factors are approximately 1.000, 0.826, 0.669, 0.529, 0.405, and 0.298 for spread values 0 through 5. A wider setting therefore makes a target easier to include in the beam but substantially reduces the damage. The truncation bug alters which targets receive that tradeoff; it does not change the damage formula itself.&lt;br /&gt;
&lt;br /&gt;
== Wraparound is not the cause ==&lt;br /&gt;
The example crosses the 0/360 boundary, but &amp;lt;code&amp;gt;smallest()&amp;lt;/code&amp;gt; contains the intended complementary-angle logic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
a = abs(a1 - a2);&lt;br /&gt;
if (a &amp;gt; 180)&lt;br /&gt;
        return 360 - a;&lt;br /&gt;
return a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The differing outcomes come from converting +2.9 to 2 and -2.9 to 357 before that function runs. The same lower-angle quantization exists away from north; the wraparound example merely makes the positive-versus-negative result easy to see.&lt;br /&gt;
&lt;br /&gt;
== Correction in ge-next ==&lt;br /&gt;
ge-next 0.3 rounds both angles to the nearest whole degree before comparing them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
deg = (unsigned)(normal(ptr-&amp;gt;heading + (double)ptr-&amp;gt;degrees) + 0.5);&lt;br /&gt;
heading = (unsigned)(vector(&amp;amp;ptr-&amp;gt;coord,&amp;amp;wptr-&amp;gt;coord) + 0.5);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Under the corrected calculation:&lt;br /&gt;
&lt;br /&gt;
* +2.9 rounds to 3 and misses;&lt;br /&gt;
* -2.9 normalizes near 357.1, rounds to 357, and also misses;&lt;br /&gt;
* +2.4 rounds to 2 and hits; and&lt;br /&gt;
* -2.4 normalizes near 357.6, rounds to 358, and also hits.&lt;br /&gt;
&lt;br /&gt;
The one-degree quantization remains, but its error is centered around each whole degree instead of always falling on the lower side. Standard phasers and hyper-phasers now use the same nearest-degree treatment.&lt;br /&gt;
&lt;br /&gt;
This correction changes only edge-of-beam hit detection. ge-next&#039;s other phaser changes, including smoother floating-point damage, preservation of the half-step contribution from even phaser classes, and use of the ship damage factor, are separate corrections documented elsewhere.&lt;br /&gt;
&lt;br /&gt;
== Discovery transcript ==&lt;br /&gt;
[[Discovery transcript: GE-BUG-023|Read the original shot observations and the initial interpretation]].&lt;br /&gt;
&lt;br /&gt;
== Porting guidance ==&lt;br /&gt;
Keep angular values as floating point through the hit test when practical. Comparing the true shortest angular difference directly against a true beam half-width avoids one-degree buckets entirely. If integer angles are required for compatibility or performance, round both the beam center and target direction by the same rule; do not truncate them.&lt;br /&gt;
&lt;br /&gt;
Tests should place targets at matching positive and negative fractional offsets around the beam center, including offsets near 0/360. Testing only integral bearings will not reveal this defect.&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Combat]]&lt;br /&gt;
[[Category:Classic bugs: Numeric correctness]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_Cargo_weight_overflow&amp;diff=2173</id>
		<title>Classic bug: Cargo weight overflow</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_Cargo_weight_overflow&amp;diff=2173"/>
		<updated>2026-10-18T18:23:57Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link bug discovery follow-up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-001&lt;br /&gt;
|affected=Classic 3.2e and published classic source&lt;br /&gt;
|status=Verified in source&lt;br /&gt;
|fixed=Initially ge-next 0.1; comprehensively rewritten in ge-next 0.3.1&lt;br /&gt;
|source=GEFUNCS.C: chkweight() and calcweight()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
Classic calculates an item&#039;s cargo contribution by multiplying its count by its configured weight before dividing by 100. The intermediate multiplication uses 32-bit arithmetic and can wrap even when the later division would produce a representable result.&lt;br /&gt;
&lt;br /&gt;
Because the same calculation is used for inventory reports and capacity checks, this is not merely a display error. A wrapped result can allow a ship to load vastly more cargo than its class permits.&lt;br /&gt;
&lt;br /&gt;
== Symptoms ==&lt;br /&gt;
A heavily loaded ship can appear to have little or no cargo weight, accept transfers far beyond its capacity, or reject a transfer whose wrapped arithmetic happens to produce a large result. Once an overflowing inventory exists, later reports and capacity decisions can change abruptly as item counts alter the wrapped remainder.&lt;br /&gt;
&lt;br /&gt;
Corrupted records and sysop testing can reach the condition immediately, but stock classic planet populations are large enough for a player to exploit some item types during ordinary play.&lt;br /&gt;
&lt;br /&gt;
== Exploit example ==&lt;br /&gt;
In the stock configuration, 100 men weigh 100 tons, so each man weighs one ton. Suppose an owned planet has at least 42,949,673 men and an empty ship requests:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TRANSFER UP 42949673 MEN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The true cargo contribution is 42,949,673 tons. Classic evaluates the numerator in 32-bit unsigned arithmetic:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
42,949,673 × 100 = 4,294,967,300&lt;br /&gt;
                     = 2^32 + 4&lt;br /&gt;
wrapped numerator    = 4&lt;br /&gt;
wrapped cargo weight = 4 / 100 = 0 tons&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The separate item-count overflow guard still passes because 42,949,673 is well below its limit. The capacity check therefore treats the transfer as adding zero tons and accepts tens of millions of men even on a small ship. [[Report command|&amp;lt;code&amp;gt;REPORT INVENTORY&amp;lt;/code&amp;gt;]] repeats the same multiplication and also omits their real weight.&lt;br /&gt;
&lt;br /&gt;
Troops make the exploit directly useful in planetary combat. Stock troops weigh 200 tons per 100. A transfer of 21,474,837 troops really weighs 42,949,674 tons, but:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
21,474,837 × 200 = 4,294,967,400&lt;br /&gt;
                     = 2^32 + 104&lt;br /&gt;
wrapped cargo weight = 104 / 100 = 1 ton&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A player who accumulates that population on an owned planet can therefore move an enormous invasion force in a ship that classic believes gained only one ton. Similar wrap points exist for every item weight.&lt;br /&gt;
&lt;br /&gt;
These examples follow deterministically from the published source and stock weights. A live classic test would confirm the complete command path and messages, but is not required to establish the arithmetic failure.&lt;br /&gt;
&lt;br /&gt;
== Cause ==&lt;br /&gt;
Classic performs the equivalent of:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(item_count × item_weight) / 100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;item_count&amp;lt;/code&amp;gt; is an unsigned long and &amp;lt;code&amp;gt;item_weight&amp;lt;/code&amp;gt; is a long. Under the target compiler&#039;s usual arithmetic conversions, the multiplication is performed as a 32-bit unsigned value. It wraps modulo 2^32 before division can reduce it. Summing multiple already-wrapped item contributions cannot recover the lost high bits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chkweight()&amp;lt;/code&amp;gt; performs this calculation for every item already aboard and again for the proposed addition. &amp;lt;code&amp;gt;calcweight()&amp;lt;/code&amp;gt; performs the same calculation for the inventory report. Their agreement therefore makes the incorrect result look internally consistent.&lt;br /&gt;
&lt;br /&gt;
== Fix history ==&lt;br /&gt;
=== ge-next 0.1 ===&lt;br /&gt;
ge-next 0.1 initially addressed the classic defect by calculating cargo contributions with floating-point arithmetic and by checking item-count addition against the unsigned-long limit before accepting a transfer. ge-next 0.1.1 refined the displayed total by accumulating fractional weight in a &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; and rounding the final result upward.&lt;br /&gt;
&lt;br /&gt;
This removed the classic 32-bit multiplication wrap for normal game values, but later exact-integer cargo work and extreme inventory testing exposed remaining edge cases involving very large totals, fractional truncation, and intermediate overflow. The cargo system was therefore revisited rather than treating the original 0.1 change as the final implementation.&lt;br /&gt;
&lt;br /&gt;
=== ge-next 0.3.1 ===&lt;br /&gt;
ge-next 0.3.1 rewrote the cargo routines with functionally equivalent but architecture-specific implementations.&lt;br /&gt;
&lt;br /&gt;
The 16-bit build cannot rely on an efficient native 64-bit integer. It splits each quantity into complete groups of 100 and a remainder below 100, checks each multiplication against the remaining capacity before performing it, and carries fractional hundredths of a ton between item types. Impossible totals saturate instead of wrapping. Its “room for item” routine uses the same capacity predicate through a binary search, ensuring that displayed weight, transfer checks, and maximum transferable amounts follow one fit rule.&lt;br /&gt;
&lt;br /&gt;
The 32-bit build uses a 64-bit unsigned accumulator measured in hundredths of a ton. It can multiply a 32-bit item count by the configured item weight directly, calculate remaining capacity in one operation, and then apply the same rounding and saturation rules as the 16-bit build.&lt;br /&gt;
&lt;br /&gt;
Both implementations reject item-count addition overflow, combine fractional weight across item types, round any final fractional ton upward for display, and return a saturated maximum for impossible or corrupted inventories.&lt;br /&gt;
&lt;br /&gt;
== Discovery transcript ==&lt;br /&gt;
[[Discovery transcript: GE-BUG-001|Read the June 2026 discussion of a later ge-next cargo-calculation failure]].&lt;br /&gt;
&lt;br /&gt;
== Compatibility notes ==&lt;br /&gt;
A port should not assume that using a wider accumulator alone resolves every case. It must also reject item-count overflow, define behavior for totals beyond the report type, combine fractional weights consistently, and ensure that reports, capacity checks, loot collection, and “maximum transfer” calculations all use the same rule.&lt;br /&gt;
&lt;br /&gt;
== Verification ==&lt;br /&gt;
The classic defect and exploit arithmetic were verified against the published classic source and stock item weights. The ge-next 0.1, 0.1.1, and 0.3.1 implementations were checked against their corresponding source revisions. The 0.3.1 routines were also exercised with inventories near the 32-bit unsigned item-count limit.&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Numeric correctness]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-055&amp;diff=2172</id>
		<title>Discovery transcript: GE-BUG-055</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-055&amp;diff=2172"/>
		<updated>2026-10-18T18:23:54Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add broadcast filter discovery excerpt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Discovery of GE-BUG-055 =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Related bug:&#039;&#039;&#039; [[Classic bug: Filtered broadcast suppresses later recipients]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Discord &amp;lt;code&amp;gt;#dev&amp;lt;/code&amp;gt; discussion, September 3, 2026. Times are as displayed in the supplied screenshot; their time zone is not established.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Editorial note:&#039;&#039;&#039; This is a short excerpt from one screenshot. The [[Classic bug: Filtered broadcast suppresses later recipients|bug article]] gives the source-level explanation and distinguishes classic&#039;s single filter from ge-next&#039;s category-based settings.&lt;br /&gt;
&lt;br /&gt;
== September 3: A hail disappears downstream ==&lt;br /&gt;
&lt;br /&gt;
; 10:50 PM — manicpoporg&lt;br /&gt;
: wow, i found an interesting legacy bug&lt;br /&gt;
: if message filters (set filter on in classic, or the category-based filters in ge-next) filter out a broadcast message for one user, it also filters it out for all users below that one&lt;br /&gt;
: let&#039;s say you have users 0, 1, 2 and 3 and user 2 has hails set to off. if user 1 hails user 0 will see it but not 2 (correct) or 3 (incorrect)&lt;br /&gt;
&lt;br /&gt;
[At 11:07 PM, GitHub announced commit &amp;lt;code&amp;gt;4beca4d&amp;lt;/code&amp;gt;, whose displayed title begins “remove obsolete mbbsemu mitigations, fix prf/fi...”.]&lt;br /&gt;
&lt;br /&gt;
== Clarification ==&lt;br /&gt;
&lt;br /&gt;
“Below that one” was informal wording. The example shows that the sender&#039;s hail reached slot 0, was intentionally suppressed at slot 2, and was then incorrectly absent for slot 3. The affected recipients are those processed &#039;&#039;after&#039;&#039; the filtered slot in the broadcast loop, not lower-numbered slots. Source review showed that rejecting one recipient cleared the shared print buffer used by the remaining recipients. ge-next 0.3.2 changed delivery so each recipient&#039;s filter affects only that recipient.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Classic bug: Filtered broadcast suppresses later recipients]]&lt;br /&gt;
* [[Set command]]&lt;br /&gt;
* [[Send command]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Classic bugs]]&lt;br /&gt;
[[Category:History]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-023&amp;diff=2171</id>
		<title>Discovery transcript: GE-BUG-023</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-023&amp;diff=2171"/>
		<updated>2026-10-18T18:23:51Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add phaser spread discovery excerpt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Discovery of GE-BUG-023 =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Related bug:&#039;&#039;&#039; [[Classic bug: Phaser spread bias]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Discord &amp;lt;code&amp;gt;#dev&amp;lt;/code&amp;gt; discussion, December 4, 2025. Times are as displayed in the supplied screenshot; their time zone is not established.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Editorial note:&#039;&#039;&#039; The screenshot captures an initial observation and a same-day fix, not a controlled measurement of both beam edges. The [[Classic bug: Phaser spread bias|bug article]] explains the verified arithmetic.&lt;br /&gt;
&lt;br /&gt;
== December 4: Asymmetric shots ==&lt;br /&gt;
&lt;br /&gt;
; 4:08 PM — manicpoporg&lt;br /&gt;
: the phaser spread is biased to the port side&lt;br /&gt;
: has anyone noticed this before&lt;br /&gt;
: spread 1 phasers hit ships bearing between -3 and +1 of aim&lt;br /&gt;
: spread 5 is between -7 and +5&lt;br /&gt;
&lt;br /&gt;
[An attached game-output image shows &amp;lt;code&amp;gt;PHA -3&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PHA 0&amp;lt;/code&amp;gt; hitting manicpop&#039;s ship, while &amp;lt;code&amp;gt;PHA 3&amp;lt;/code&amp;gt; produces no hit message. The accompanying note says the target ship&#039;s displayed bearing was 0.]&lt;br /&gt;
&lt;br /&gt;
; 4:08 PM — manicpoporg&lt;br /&gt;
: that&#039;s with a ship bearing 0&lt;br /&gt;
&lt;br /&gt;
[At 4:40 PM, GitHub announced commit &amp;lt;code&amp;gt;7d172f0&amp;lt;/code&amp;gt;, “fix phaser spread / round deg and heading.”]&lt;br /&gt;
&lt;br /&gt;
== Interpreting the first observation ==&lt;br /&gt;
&lt;br /&gt;
The three shots made an asymmetry apparent, but “bearing 0” was a displayed whole-degree value, not a record of the target&#039;s exact angle. The screenshot therefore does not by itself prove that the port side is favored for every heading and target position, or establish the stated beam boundaries. Later source review identified the underlying issue: classic truncates the firing direction and target direction to whole degrees before comparing them. For the heading-zero geometry worked through in the bug article, that truncation favors the positive/starboard edge. The original “port side” description is retained above as part of the discovery history, not as the final general rule.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Classic bug: Phaser spread bias]]&lt;br /&gt;
* [[Phasers]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Classic bugs]]&lt;br /&gt;
[[Category:History]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-001&amp;diff=2170</id>
		<title>Discovery transcript: GE-BUG-001</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Discovery_transcript:_GE-BUG-001&amp;diff=2170"/>
		<updated>2026-10-18T18:23:47Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add cargo overflow discovery follow-up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Discovery follow-up for GE-BUG-001 =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Related bug:&#039;&#039;&#039; [[Classic bug: Cargo weight overflow]]&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Source:&#039;&#039;&#039; Discord direct message between Oliver and manicpoporg, June 17, 2026. Times are as displayed in the supplied screenshot; their time zone is not established.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Editorial note:&#039;&#039;&#039; This is a later ge-next cargo-capacity report, not the original discovery of classic GE&#039;s overflow. The screenshot and quoted chat show how an inadequacy in the early ge-next cargo fix was noticed. The [[Classic bug: Cargo weight overflow|bug article]] distinguishes the classic defect from the subsequent fixes.&lt;br /&gt;
&lt;br /&gt;
== June 17: Planetary Transport capacity report ==&lt;br /&gt;
&lt;br /&gt;
[Oliver shared game output from a Planetary Transport. A planet scan showed 217,993 food cases. &amp;lt;code&amp;gt;TRAN UP 217993 FOO&amp;lt;/code&amp;gt; was refused with “There is not enough space available for that many items.” The inventory report showed 22,655,938 men, 1,902,680 food cases, other cargo, and a reported total cargo weight of 26,905,885 tons. The output also contained an unrelated “There is no such planet in this sector” message.]&lt;br /&gt;
&lt;br /&gt;
; 4:19 PM — Oliver&lt;br /&gt;
: Bug on PT capacity?&lt;br /&gt;
&lt;br /&gt;
; 4:39 PM — manicpoporg&lt;br /&gt;
: the weight calculation is overflowing the 32-bit long&lt;br /&gt;
&lt;br /&gt;
; 4:49 PM — Oliver&lt;br /&gt;
: Why did that change?&lt;br /&gt;
&lt;br /&gt;
; 5:21 PM — manicpoporg&lt;br /&gt;
: i don&#039;t know, the weight calculation has gotten too convoluted&lt;br /&gt;
: i need to rewrite it and probably have different routines for the 16-bit and 32-bit builds&lt;br /&gt;
&lt;br /&gt;
== What this established ==&lt;br /&gt;
&lt;br /&gt;
The refusal and unusually large inventory exposed a cargo-calculation problem in ge-next after its initial classic-overflow fix. The chat&#039;s “32-bit long” diagnosis was an immediate working explanation, not a complete analysis of every arithmetic path. Subsequent review led to architecture-specific cargo implementations in ge-next 0.3.1; the bug article explains those fixes. This screenshot alone does not show that the displayed Planetary Transport inventory was produced by the original classic exploit.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Classic bug: Cargo weight overflow]]&lt;br /&gt;
* [[Ship inventory]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Classic bugs]]&lt;br /&gt;
[[Category:History]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Planetary_update_cycle&amp;diff=2164</id>
		<title>Planetary update cycle</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Planetary_update_cycle&amp;diff=2164"/>
		<updated>2026-10-18T17:54:11Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Planetary update cycles&#039;&#039;&#039; decide &#039;&#039;when&#039;&#039; a planet record is visited and how many production passes are due. The scheduled routine is &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; in the 16-bit [[Source code|source]]; the 5.x &amp;lt;code&amp;gt;plarti()&amp;lt;/code&amp;gt; and 6.x &amp;lt;code&amp;gt;pplarti()&amp;lt;/code&amp;gt; callbacks forward to it. The 32-bit implementation is named &amp;lt;code&amp;gt;plarti()&amp;lt;/code&amp;gt;. When a colony is due, the routine calls &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt;; [[Planetary production]] explains what that one economic pass does. Neither visiting a planet nor scanning it immediately runs a production pass.&lt;br /&gt;
&lt;br /&gt;
== Classic GE: a continuous database sweep ==&lt;br /&gt;
Classic [[MajorBBS integration|MajorBBS]] schedules the next &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; callback after a variable &amp;lt;code&amp;gt;plantime&amp;lt;/code&amp;gt; delay. The &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt; setting specifies the target duration, in minutes, for &#039;&#039;one complete sweep&#039;&#039; of the database; its distributed value of 360 minutes aims for roughly four sweeps a day. It is not a per-planet timer or a guarantee of four updates on each calendar day.&lt;br /&gt;
&lt;br /&gt;
The routine stores a [[Btrieve]] cursor position in memory and advances through the shared sector, planet, and wormhole file. Each invocation examines up to 20 records while seeking its next planet. A callback that finds no planet may therefore do no economic work. A populated planet with an owner is passed to &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;check_spy()&amp;lt;/code&amp;gt;; empty or unowned planets are skipped. [[Zygor]] and [[Tahanian Station]] also receive special stock resets when their records are encountered, after any applicable ordinary planet processing. See their pages for the resulting classic behavior.&lt;br /&gt;
&lt;br /&gt;
At the end of the file, classic measures approximately how long the sweep took from the number of callbacks and the current delay. It recalculates &amp;lt;code&amp;gt;plantime&amp;lt;/code&amp;gt; to bring the &#039;&#039;next&#039;&#039; sweep closer to &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt;, but will not schedule callbacks less than three seconds apart. The cursor then starts over immediately. This feedback cannot enforce an exact number of passes: a planet may be reached three or five times in a day, and the work of walking sector and wormhole records increases as the galaxy is explored. A restart loses the in-memory cursor and timing history; downtime is neither recorded nor replayed. See [[Classic bug: Skipped planetary updates]] for the failure modes and examples.&lt;br /&gt;
&lt;br /&gt;
== ge-next: named daily passes ==&lt;br /&gt;
[[ge-next]] 0.2 replaced the continuous-sweep target with &amp;lt;code&amp;gt;PLANUPD&amp;lt;/code&amp;gt;, the desired number of passes per day (four by default; the setting allows 1–15). The scheduler walks the planet portion of the database index rather than scanning ordinary sector and wormhole records. It seeks an owned planet with men or troops, or one of the neutral-zone planets, and processes at most one selected planet per callback. It can inspect up to 25 records while looking for the next eligible one. At the end of a pass, it adjusts &amp;lt;code&amp;gt;plantime&amp;lt;/code&amp;gt; to aim for the remaining passes to fit within 23 hours, leaving some margin before the day ends. Once the configured passes are complete, it stops applying further production passes that day rather than starting an extra sweep.&lt;br /&gt;
&lt;br /&gt;
[[Zygor]], [[Tahanian Station]], and the [[Enforcer Planet]] take dedicated update paths. Ordinary eligible colonies call &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; for production and &amp;lt;code&amp;gt;check_spy()&amp;lt;/code&amp;gt; for spies. This separates special market restocking from colony food, population, tax, and revolt processing; it also avoids classic&#039;s first-update starvation problem at Zygor. The scheduler still records progress on the special planets, but they do not run ordinary colony production.&lt;br /&gt;
&lt;br /&gt;
== Timestamps, restart, and catch-up ==&lt;br /&gt;
Every ge-next planet record carries a 32-bit &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; combining the current game-day number in its upper bits with the pass number in its low four bits. Those four bits can hold the supported 1–15 daily passes. After a planet is processed, its day and pass are written to the database. A restarted or interrupted sweep may encounter the same record again, but the stored marker prevents it from receiving the same production pass twice.&lt;br /&gt;
&lt;br /&gt;
Zygor&#039;s record additionally saves the global scheduler&#039;s current day/pass marker and calibrated callback interval. On startup, ge-next reads those values to resume today&#039;s work if applicable. If no useful interval has been saved, it estimates one from the current record count. A correction in ge-next 0.2.2 clears a stale saved interval after a day in which even the first pass failed to complete; otherwise rapid early database growth could leave the first pass too slow ever to reach its recalibration point.&lt;br /&gt;
&lt;br /&gt;
If an ordinary planet&#039;s timestamp shows that it missed passes during an interruption or downtime, the scheduler calculates the number due and calls &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; repeatedly. This catch-up is limited to recent history: planets behind within the previous seven days can replay missed passes, whereas older records receive one update instead of an unbounded backlog. Intermediate replays suppress repetitive player mail; the final pass may send its normal reports. The timestamp is a record of completed passes, not a promise that all missed work happens immediately when the BBS starts: the scheduler still has to reach that planet&#039;s record.&lt;br /&gt;
&lt;br /&gt;
== What this means in play ==&lt;br /&gt;
A newly claimed colony will not produce goods until the scheduler reaches it. A change to its work allocation, tax, food stock, or bank affects the next pass that &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; applies; it does not instantly recalculate existing inventory. After downtime, ge-next may apply several due passes together, so population and stock can change in a burst. Classic instead resumes sweeping from the beginning without knowing which planets were already visited. For the output, food, bank, tax, and revolt calculations within each pass, see [[Planetary production]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Planetary production]] and [[Colonizing planets]]&lt;br /&gt;
* [[Game timing]] and [[Game execution flow]]&lt;br /&gt;
* [[Classic bug: Skipped planetary updates]]&lt;br /&gt;
* [[Zygor]] and [[Tahanian Station]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Planets]]&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Game_execution_flow&amp;diff=2163</id>
		<title>Game execution flow</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Game_execution_flow&amp;diff=2163"/>
		<updated>2026-10-18T17:54:09Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Galactic Empire&#039;&#039;&#039; is a MajorBBS module, not a standalone program with one continuously running game loop. MajorBBS calls the module at startup and later dispatches user input, timer callbacks, and lifecycle events independently. The diagram summarizes the module architecture shared by classic GE and ge-next, with ge-arena differences identified where they change the flow. It is a map of responsibilities, not a guarantee that callbacks happen in the order drawn.&lt;br /&gt;
&lt;br /&gt;
[[File:GE module flow shared GE.png|center|alt=MajorBBS module startup branching into player input, recurring callbacks, and lifecycle events that share game state]]&lt;br /&gt;
&lt;br /&gt;
Solid arrows are direct calls; dashed arrows represent later host dispatch; dotted arrows show access to shared game state.&lt;br /&gt;
&lt;br /&gt;
== Startup ==&lt;br /&gt;
In the 16-bit MajorBBS 5.x build, the module&#039;s startup entry point is &amp;lt;code&amp;gt;iniwar()&amp;lt;/code&amp;gt;; in the 6.x PHARLAP build, it is &amp;lt;code&amp;gt;init__galemp()&amp;lt;/code&amp;gt;. Both call &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt;. That routine loads options and message resources, opens the relevant [[Btrieve]] files, builds ship-class and other live tables, and registers the first recurring callbacks with &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt;. The 6.x entry point then calls &amp;lt;code&amp;gt;register_module()&amp;lt;/code&amp;gt;. The resulting module interface tells MajorBBS which functions to invoke for input and lifecycle events.&lt;br /&gt;
&lt;br /&gt;
== Runtime branches ==&lt;br /&gt;
* &#039;&#039;&#039;Player input:&#039;&#039;&#039; MajorBBS can invoke &amp;lt;code&amp;gt;gelogon()&amp;lt;/code&amp;gt; at login and &amp;lt;code&amp;gt;galemp()&amp;lt;/code&amp;gt; when a user selects the module or enters text within it. &amp;lt;code&amp;gt;galemp()&amp;lt;/code&amp;gt; looks up the user&#039;s current &amp;lt;code&amp;gt;substt&amp;lt;/code&amp;gt; in the menu-state table, then calls the matching handler. That handler may present the main menu, interpret a ship command, continue a prompt, or enter the ge-arena lobby.&lt;br /&gt;
* &#039;&#039;&#039;Recurring callbacks:&#039;&#039;&#039; Each scheduled callback runs its work and schedules its next &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt;. The one-second &amp;lt;code&amp;gt;warrti2()&amp;lt;/code&amp;gt; path moves one third of the ship slots; the separate one-second &amp;lt;code&amp;gt;autorti()&amp;lt;/code&amp;gt; path visits automated ships. ge-arena also advances its match timers from &amp;lt;code&amp;gt;warrti2()&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;warrti()&amp;lt;/code&amp;gt; runs the six-second ship-system pass. GE also runs the neutral-zone warning through &amp;lt;code&amp;gt;warrti3()&amp;lt;/code&amp;gt; and variable-interval planet updates through &amp;lt;code&amp;gt;plarti()&amp;lt;/code&amp;gt;. In 16-bit GE, the 5.x and 6.x timer entry points are forwarding wrappers: for example, &amp;lt;code&amp;gt;plarti()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;pplarti()&amp;lt;/code&amp;gt; both call &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt;. The same pattern applies to &amp;lt;code&amp;gt;autortia()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;warrtia()&amp;lt;/code&amp;gt;. In the 32-bit port, &amp;lt;code&amp;gt;plarti()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autorti()&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;warrti()&amp;lt;/code&amp;gt; contain the implementations directly. See [[Game timing]] for exact first-run intervals, called routines, and gameplay consequences.&lt;br /&gt;
* &#039;&#039;&#039;Lifecycle events:&#039;&#039;&#039; MajorBBS invokes the module&#039;s logoff, hangup, account-deletion, midnight-cleanup, and shutdown hooks separately from &amp;lt;code&amp;gt;galemp()&amp;lt;/code&amp;gt;. Their implementation routines release or update the relevant game state. These hooks are dispatched by MajorBBS rather than by the player-input routine or a game timer.&lt;br /&gt;
&lt;br /&gt;
All three runtime branches can read or change shared in-memory user and ship tables and persistent Btrieve records. The diagram&#039;s bottom bar represents those resources, not a fourth periodic callback. A callback may observe a change made by another branch on its next scheduled pass; there is no single master tick that synchronizes them. The calls and timing within the recurring branch are detailed in [[Game timing]].&lt;br /&gt;
&lt;br /&gt;
== Nightly cleanup and shutdown ==&lt;br /&gt;
=== Midnight routine ===&lt;br /&gt;
During the BBS&#039;s scheduled cleanup, MajorBBS invokes GE&#039;s registered midnight callback: &amp;lt;code&amp;gt;gemidnight()&amp;lt;/code&amp;gt; on 5.x or &amp;lt;code&amp;gt;pgemidnight()&amp;lt;/code&amp;gt; on 6.x. Both forward to &amp;lt;code&amp;gt;gemidnighta()&amp;lt;/code&amp;gt;. Despite the name, this runs when the &#039;&#039;BBS&#039;&#039; performs its daily cleanup, not from a GE timer that fires at exactly 12:00 a.m. It is a lifecycle callback, separate from the recurring &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt; schedules.&lt;br /&gt;
&lt;br /&gt;
In classic GE and normal ge-next play, the routine performs these jobs in order:&lt;br /&gt;
# It clears each player&#039;s cached planet count, population, planet score, and total score. ge-next also reduces saved faction dislike and prunes stale automated-ship records.&lt;br /&gt;
# It walks the planet database. For every owned planet with a matching player record, it recalculates the planet&#039;s contribution to that player&#039;s score and totals, then creates a planetary status report for the owner. ge-next also checks whether the first scheduled planet-update pass completed; if not, it arranges for the update interval to be recalculated.&lt;br /&gt;
# It deletes old mail and mail addressed to deleted players, according to the configured retention period.&lt;br /&gt;
# It reconciles team membership, clears invalid team assignments, recomputes player totals from planet and kill scores, removes empty teams, and updates team standings. Classic also saves each player&#039;s roster position for the rank-based kill bonus. ge-next instead determines current roster position when needed and can write an optional text roster export.&lt;br /&gt;
&lt;br /&gt;
This pass &#039;&#039;accounts for&#039;&#039; planets; it does not run planetary production. Production is driven by the separate [[Planetary update cycle|planet-update schedule]]. Combat points are applied when kills occur, whereas planet value and the resulting roster total are refreshed here. See [[Scoring and rosters]] and [[Teams]] for the scoring rules and team calculations.&lt;br /&gt;
&lt;br /&gt;
ge-arena uses the same host callback for a much narrower job: it refreshes persistent win totals for its roster and writes the optional roster export. It does not run the normal game&#039;s planet, mail, or team cleanup.&lt;br /&gt;
&lt;br /&gt;
=== Shutdown and disconnections ===&lt;br /&gt;
The midnight callback itself does not disconnect players or close the module. When the BBS disconnects users as part of its own cleanup, GE receives separate hangup callbacks; the [[MajorBBS integration]] page explains the classic combat-loss consequence and ge-next&#039;s &amp;lt;code&amp;gt;rsmodes&amp;lt;/code&amp;gt; safeguard. On module shutdown, MajorBBS calls &amp;lt;code&amp;gt;clswar()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pclswar()&amp;lt;/code&amp;gt;, which forward to &amp;lt;code&amp;gt;clswara()&amp;lt;/code&amp;gt; to close message and database files. Ordinary logoff, hangup, and account deletion can also occur at other times. The diagram therefore branches after startup rather than drawing a single path that ends at midnight.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Game timing]]&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
* [[MajorBBS integration]]&lt;br /&gt;
* [[Data structures]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Source code]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_registration_and_security_system&amp;diff=2162</id>
		<title>Classic registration and security system</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_registration_and_security_system&amp;diff=2162"/>
		<updated>2026-10-18T17:54:06Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Galactic Empire 3.2e contains a board-specific registration system, a time-limited test-drive system, protected [[Btrieve]] database handling, and a second concealed system check. These mechanisms are separate from &amp;lt;code&amp;gt;PLAYKEY&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SYSKEY&amp;lt;/code&amp;gt;, which control user access and administrative privileges.&lt;br /&gt;
&lt;br /&gt;
The released source contains two largely independent layers. The documented registration and test-drive system is implemented by &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; and was introduced in release 3.0d so GE could be distributed generally. The concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; account check has no visible connection to that system and may have an older origin.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; registration system ==&lt;br /&gt;
=== Security state ===&lt;br /&gt;
The shared &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt; structure records three states:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;code&amp;gt;open_stat&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || The configured registration number is valid for this BBS&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; || The registration number is invalid or absent, but the test drive remains active&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Security validation failed or the test drive has expired; GE is disabled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;days_run&amp;lt;/code&amp;gt; holds the test-drive startup-day count and &amp;lt;code&amp;gt;days_tot&amp;lt;/code&amp;gt; holds its permitted length. At startup, classic reports the registration number, the current test-drive day, or that the unregistered game is disabled.&lt;br /&gt;
&lt;br /&gt;
When disabled, GE does not schedule ship, NPC, planet, or automatic-update callbacks. Login, cleanup, deletion, hangup, and ordinary command entry also contain guards against operating on the protected databases. A player who enters the module receives the trial-expired notice instead of the game. The records are not erased: entering a valid registration number allows the game to continue where it stopped.&lt;br /&gt;
&lt;br /&gt;
=== Original registration number ===&lt;br /&gt;
Classic&#039;s &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; configuration option accepts an eight-character registration number tied to the host BBS registration number. The internal registration utility identifies Galactic Empire as using seed &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; and method 1. These are also the values actually selected by &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The standalone &amp;lt;code&amp;gt;SECURE.H&amp;lt;/code&amp;gt; contains generic example values (including a different seed and method 0). They are not Galactic Empire&#039;s effective values: &amp;lt;code&amp;gt;sec_opnbtv()&amp;lt;/code&amp;gt; receives GE&#039;s values as arguments from &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Generation algorithm ====&lt;br /&gt;
The publisher&#039;s &amp;lt;code&amp;gt;REGISTER&amp;lt;/code&amp;gt; utility asks for the product seed, method, and customer&#039;s eight-digit MajorBBS or Worldgroup registration number. For GE it generates the key as follows:&lt;br /&gt;
&lt;br /&gt;
# Convert the seed and BBS registration number to integers.&lt;br /&gt;
# XOR the two integer values.&lt;br /&gt;
# Represent the result as an eight-position, right-aligned decimal value.&lt;br /&gt;
# For method 1, add the corresponding seed digit to each position and retain only the last decimal digit.&lt;br /&gt;
&lt;br /&gt;
In compact form, the final operation for each position is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
registration_digit[i] = (xor_digit[i] + seed_digit[i]) % 10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The runtime &amp;lt;code&amp;gt;protect()&amp;lt;/code&amp;gt; routine independently derives the same value from MajorBBS&#039;s &amp;lt;code&amp;gt;bturno&amp;lt;/code&amp;gt; and compares it with &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt;. Consequently, a key generated for one registered BBS does not register another.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;REGISTER.EXE&amp;lt;/code&amp;gt; was the utility specified for Galactic Empire and The Legend of Elyth Gor. The accompanying &amp;lt;code&amp;gt;REG2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;REG3&amp;lt;/code&amp;gt; algorithms were intended for other M.B. Murdock products and are not used by GE.&lt;br /&gt;
&lt;br /&gt;
=== Protected databases ===&lt;br /&gt;
The ship and mail databases are opened normally. The planet and user databases are opened through &amp;lt;code&amp;gt;sec_opnbtv()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The routine derives the correct board-specific registration value even while the game is running as an unregistered test drive. It supplies that value to the Btrieve open path and invokes Btrieve operation 29 (Set Owner), binding the protected files to the board-specific value.&lt;br /&gt;
&lt;br /&gt;
Each protected database also receives a concealed record whose first key is a high-valued byte string defined by &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt;. The remaining bytes hold four encoded fields:&lt;br /&gt;
&lt;br /&gt;
* the first test-drive date;&lt;br /&gt;
* the last date on which the module was started;&lt;br /&gt;
* the number of distinct startup dates; and&lt;br /&gt;
* a second copy of the first date tied to the BBS registration number.&lt;br /&gt;
&lt;br /&gt;
The stored bytes are additionally offset by their positions in the record. This is obfuscation and tamper detection, not encryption in the modern sense. On each new calendar date, the run counter and last-run date are updated.&lt;br /&gt;
&lt;br /&gt;
For the original GE seed, characters 1 and 7 are combined to produce a 15-day test-drive limit. The test drive is rejected if its initial date is in the future, elapsed calendar time exceeds the limit, the startup-day count exceeds the limit, or the redundant board-bound date does not agree. This means both clock rollback and simply avoiding daily use are accounted for: elapsed calendar time is checked independently of the number of days on which GE started.&lt;br /&gt;
&lt;br /&gt;
Because the security information is stored as an otherwise valid database record, code that walks the user database must recognize and skip the &amp;lt;code&amp;gt;KEY&amp;lt;/code&amp;gt; record. Classic&#039;s midnight cleanup does this explicitly. A port or database tool that treats every record as a player can expose the security record in a roster or, worse, rewrite it as player data.&lt;br /&gt;
&lt;br /&gt;
==== Startup cross-check ====&lt;br /&gt;
&amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; first opens the planet database and saves its resulting security state. It then opens the user database and requires both databases to agree on &amp;lt;code&amp;gt;open_stat&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;days_tot&amp;lt;/code&amp;gt;. A disagreement causes a fatal &amp;lt;code&amp;gt;Secure Stat Open failure&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Secure Days Open failure&amp;lt;/code&amp;gt;. This prevents the game from quietly combining protected files with incompatible security state.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; contains a commented build-time &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; switch. When enabled, the planet and user files use ordinary &amp;lt;code&amp;gt;opnbtv()&amp;lt;/code&amp;gt;, and a dummy &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt; structure reports a registered state. It bypasses the protected open, trial counter, and cross-database registration checks.&lt;br /&gt;
&lt;br /&gt;
The switch is disabled in the released source. It is also not a complete removal of all security-related code: the separate &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; check remains compiled and callable.&lt;br /&gt;
&lt;br /&gt;
== Common online 3.2e build ==&lt;br /&gt;
A 3.2e package commonly distributed with MBBSEmu differs from the released source configuration. Its &amp;lt;code&amp;gt;REGIST.TXT&amp;lt;/code&amp;gt; instructs the sysop to &amp;quot;Use your activation code for MBBS&amp;quot; rather than obtain the derived GE registration number.&lt;br /&gt;
&lt;br /&gt;
Running the DLL with the default &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; produces GE&#039;s trial-expired message. It also creates and evaluates the concealed records in both protected databases. It therefore is &#039;&#039;&#039;not&#039;&#039;&#039; a &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; build.&lt;br /&gt;
&lt;br /&gt;
Decoding a newly created security record shows that its date is stored without the XOR transformation that the original &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; seed would produce. The DLL contains no &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; string and instead has a second &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt; string consistent with a replaced seed. Its effective security seed is &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
That change has two consequences:&lt;br /&gt;
&lt;br /&gt;
* XOR with zero leaves &amp;lt;code&amp;gt;bturno&amp;lt;/code&amp;gt; unchanged, and method-1 digit addition with zero changes no digits. The valid &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is therefore the BBS&#039;s own eight-digit registration number.&lt;br /&gt;
* The test-drive length is derived from positions 1 and 7 of the seed. A zero seed produces a zero-day allowance, so an incorrect or absent &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is disabled immediately.&lt;br /&gt;
&lt;br /&gt;
This exactly matches the package&#039;s instructions and observed behavior. The change could have been made by rebuilding after changing the source constant, or by replacing the eight ASCII bytes &amp;lt;code&amp;gt;10094056&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;00000000&amp;lt;/code&amp;gt; directly in the DLL. The resulting binary alone cannot distinguish between those methods.&lt;br /&gt;
&lt;br /&gt;
== The concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; check ==&lt;br /&gt;
&amp;lt;code&amp;gt;GELIB.C&amp;lt;/code&amp;gt; describes &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; only as &amp;quot;Verify system.&amp;quot; Its name does not describe its operation. On its first call, it constructs the otherwise unobvious account key &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt;, selects MajorBBS&#039;s account database, and searches key 0. If that account record exists, GE terminates with &amp;lt;code&amp;gt;GE SYSTEM FAULT&amp;lt;/code&amp;gt;. If it does not exist, a static flag prevents the test from running again during that module load.&lt;br /&gt;
&lt;br /&gt;
The released GE source contains no routine that creates the &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt; account, so the intended path by which that marker would be placed cannot be established from GE&#039;s source alone.&lt;br /&gt;
&lt;br /&gt;
Rather than calling this check visibly during initialization, classic places it inside &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;, GE&#039;s floating-point absolute-value helper. Normal navigation and combat mathematics eventually call &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;, which makes the security test occur indirectly. The function also changes the current Btrieve context to the account database and does not restore the prior context; ports should understand that as an implementation side effect, not as part of absolute-value behavior.&lt;br /&gt;
&lt;br /&gt;
=== Possible earlier origin ===&lt;br /&gt;
Before version 3, GE was distributed for MajorBBS 5.x as source that became part of the compiled BBS rather than as a drop-in module DLL. The release notes specifically identify the &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt;-style registration protection as a new 3.0d feature. By contrast, &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; is independent of that system, survives the &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt; bypass, and checks for a marker that no surviving 3.2e routine creates.&lt;br /&gt;
&lt;br /&gt;
These facts make it plausible that &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; is a remnant of an earlier source-distribution-era protection scheme, perhaps paired with an old installer, build procedure, or security component that created &amp;lt;code&amp;gt;Glperr&amp;lt;/code&amp;gt;. No pre-3.x implementation or marker-creation utility is present in the available archive, however, so this remains a historical hypothesis rather than an established fact.&lt;br /&gt;
&lt;br /&gt;
== Source integration ==&lt;br /&gt;
The classic implementation is distributed across several locations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Location !! Role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SECURE.C&amp;lt;/code&amp;gt; || Protected Btrieve open, owner setup, registration comparison, trial record, counters, and tamper checks&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SECURE.H&amp;lt;/code&amp;gt; || Generic declarations and sample defaults; not the authoritative GE constants&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt; || GE&#039;s actual method, seed, high-key value, structure declaration, and prototype&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt; || Protected database opens, cross-checks, scheduler and entry guards, status messages, and &amp;lt;code&amp;gt;FAKESECURE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GELIB.C&amp;lt;/code&amp;gt; || Concealed &amp;lt;code&amp;gt;c4angle()&amp;lt;/code&amp;gt; account check through &amp;lt;code&amp;gt;absol()&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GECMDS.C&amp;lt;/code&amp;gt; || Implementation of the diagnostic &amp;lt;code&amp;gt;RG#&amp;lt;/code&amp;gt; display&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MBMGEMP.LNK&amp;lt;/code&amp;gt; || Links the separately compiled security object into the module&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;register/REGISTER.CPP&amp;lt;/code&amp;gt; || Publisher-side method-1 registration-number generator&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The installation manual documents &amp;lt;code&amp;gt;RG#&amp;lt;/code&amp;gt; as a technical-support command that reports the configured registration number, security state, and test-drive day. Its command-table entry is commented out in 3.2e, although the handler remains in the source; see [[Commands#Administration and diagnostics]]. The classic [[Who command|&amp;lt;code&amp;gt;WHO&amp;lt;/code&amp;gt;]] terminal-support command likewise exposes the BBS registration number in PHARLAP/MajorBBS 6.x builds.&lt;br /&gt;
&lt;br /&gt;
== ge-next ==&lt;br /&gt;
ge-next does not enforce classic&#039;s commercial registration or test-drive system and does not place security records in its databases. Its &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; setting is only an optional installation identifier, not an unlock key. Since version 0.3.2, a blank or zero value produces no registration line at startup; a configured value is shown there and can distinguish multiple installations. &amp;lt;code&amp;gt;REGNO&amp;lt;/code&amp;gt; is not player authentication or a frontend pairing code: the separate &amp;lt;code&amp;gt;FRONTEND&amp;lt;/code&amp;gt; option controls [[Data command|DATA]] access.&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Sysop documentation]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_Skipped_planetary_updates&amp;diff=2161</id>
		<title>Classic bug: Skipped planetary updates</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_Skipped_planetary_updates&amp;diff=2161"/>
		<updated>2026-10-18T17:54:05Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-011&lt;br /&gt;
|affected=Classic 3.2e and published classic source&lt;br /&gt;
|status=Verified through source analysis and long-running games&lt;br /&gt;
|fixed=ge-next 0.2; startup calibration refined in 0.2.2&lt;br /&gt;
|source=Classic GEMAIN.C: plartia(); ge-next GEMAIN.C: plartia()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
Classic Galactic Empire does not record when an individual planet was last updated. Instead, one process-local cursor continuously sweeps through the entire planet database and updates planets as it encounters them. The routine tries to adjust its own callback interval so that one sweep takes the number of minutes configured by &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This makes the configured period only a target for a complete database sweep, not a guarantee that every planet receives a fixed number of updates in a calendar day. With the recommended six-hour setting, some planets can receive three updates in a day while others receive five. Interrupted sweeps, server downtime, and restarts can make the difference more pronounced. As the database grows, the scheduler also spends increasing amounts of time walking [[Sector|sector]] and wormhole records that cannot receive economic updates.&lt;br /&gt;
&lt;br /&gt;
== Classic scheduling model ==&lt;br /&gt;
Classic describes &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt; as the amount of time in which to update all planets. Its default of 360 minutes is intended to produce four updates per day. The implementation does not divide the day into four named update periods, however. It continuously repeats this process:&lt;br /&gt;
&lt;br /&gt;
# Start at the beginning of the shared sector/planet/wormhole database.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; after the current &amp;lt;code&amp;gt;plantime&amp;lt;/code&amp;gt; delay.&lt;br /&gt;
# Examine records until one planet is found or 20 records have been examined.&lt;br /&gt;
# If a planet was found, update at most that one planet.&lt;br /&gt;
# Save the [[Btrieve]] absolute position in the process-local &amp;lt;code&amp;gt;fpos&amp;lt;/code&amp;gt; variable and schedule another callback.&lt;br /&gt;
# At end of file, measure how long the sweep took, adjust &amp;lt;code&amp;gt;plantime&amp;lt;/code&amp;gt;, reset the cursor, and immediately begin another sweep.&lt;br /&gt;
&lt;br /&gt;
The updater therefore normally handles no more than one planet per callback. It may handle no planet at all: &amp;lt;code&amp;gt;MAXTIC&amp;lt;/code&amp;gt; limits one invocation to 20 database records, so an invocation that encounters 20 sector or wormhole records merely advances the cursor.&lt;br /&gt;
&lt;br /&gt;
Only an owned planet with population is passed to the normal economic &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; routine. The neutral-zone planets receive their own special replenishment treatment. Empty and unowned planets do not receive an economic update, but the scheduler still has to find and inspect their records.&lt;br /&gt;
&lt;br /&gt;
=== Adaptive timing ===&lt;br /&gt;
Classic starts with a delay of approximately 55 seconds between callbacks. At the end of a sweep it calculates approximately:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
measured sweep time = callback count * current callback delay&lt;br /&gt;
new callback delay  = current delay * (PLANTOCK / measured sweep time)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, if a sweep takes twice the configured target, the next callback delay is roughly halved. The result is never allowed below three seconds. This is feedback control based on the preceding sweep, not a schedule tied to the clock or to individual planets.&lt;br /&gt;
&lt;br /&gt;
== Why four updates per day is not guaranteed ==&lt;br /&gt;
A six-hour &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt; only asks the routine to make a complete pass approximately every six hours. There is no concept of &amp;quot;update 1,&amp;quot; &amp;quot;update 2,&amp;quot; &amp;quot;update 3,&amp;quot; and &amp;quot;update 4&amp;quot; for a particular day, and there is no check that stops updates after a planet has received four.&lt;br /&gt;
&lt;br /&gt;
Even when every sweep finishes normally, its boundaries are unrelated to midnight. Small timing differences accumulate from callback scheduling, database activity, and integer rounding. A calendar day can consequently contain only three visits to a particular planet or can catch five visits near the edges of successive sweeps. The routine simply begins another pass whenever the previous one ends.&lt;br /&gt;
&lt;br /&gt;
In an uninterrupted completed sweep, the cursor ordinarily reaches each eligible planet once. The larger problem is that classic has no durable way to know whether any particular planet has already received the update that should correspond to a given part of the day.&lt;br /&gt;
&lt;br /&gt;
== Database growth and wasted work ==&lt;br /&gt;
The file traversed by &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; is not a planet-only file. It contains the persistent records created as the galaxy is explored:&lt;br /&gt;
&lt;br /&gt;
* sector records;&lt;br /&gt;
* planet records; and&lt;br /&gt;
* wormhole records.&lt;br /&gt;
&lt;br /&gt;
Classic begins its scan at the sector-record portion of the index and counts sector and wormhole records while looking for planets. Those records cannot receive population, production, food-consumption, tax, or spy updates, so this work is scheduler overhead.&lt;br /&gt;
&lt;br /&gt;
This matters because scanning creates a sector record even when the sector has no planets. The database therefore tends to accumulate non-planet records faster than updateable colonies. As exploration continues, more callbacks are consumed merely advancing through the file. The adaptive calculation lowers the callback delay to compensate, but it cannot go below three seconds and each invocation still examines at most 20 records and updates at most one planet.&lt;br /&gt;
&lt;br /&gt;
Eventually the requested number of full passes may require more work than the routine can perform at those limits. Long before that hard ceiling, growth during one sweep and the use of the previous sweep as the timing estimate can make the actual cycle length lag behind its configured target. The classic documentation itself warns that CPU load grows with the galaxy and recommends increasing &amp;lt;code&amp;gt;PLANTOCK&amp;lt;/code&amp;gt; or reducing &amp;lt;code&amp;gt;UNIVMAX&amp;lt;/code&amp;gt; when performance becomes a problem.&lt;br /&gt;
&lt;br /&gt;
== Restarts and downtime ==&lt;br /&gt;
Classic stores its traversal cursor, callback count, and timing counters only in static variables. They are lost when the module or server restarts. The planet record contains no last-update day, pass number, or elapsed-time marker.&lt;br /&gt;
&lt;br /&gt;
This has several consequences:&lt;br /&gt;
&lt;br /&gt;
* A restart in the middle of a sweep starts the next run at the beginning of the database. Planets before the old cursor may be updated again before planets after it receive the interrupted pass.&lt;br /&gt;
* Hours or days of downtime produce no updates, and there is no catch-up when the game returns.&lt;br /&gt;
* A restart cannot distinguish a planet updated moments before shutdown from one that has not been updated for days.&lt;br /&gt;
* The adaptive interval also has to establish itself again instead of resuming from durable scheduler state.&lt;br /&gt;
&lt;br /&gt;
These failures are not recoverable from the classic records because the information needed to reconstruct the missed work was never recorded.&lt;br /&gt;
&lt;br /&gt;
== ge-next correction ==&lt;br /&gt;
ge-next 0.2 replaced the classic sweep with a day-and-pass scheduler. The configuration specifies the desired number of updates per day with &amp;lt;code&amp;gt;PLANUPD&amp;lt;/code&amp;gt; (four by default), rather than specifying an approximate duration for an endlessly repeated sweep.&lt;br /&gt;
&lt;br /&gt;
Each planet record has an unsigned-long &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt;. ge-next packs two values into it:&lt;br /&gt;
&lt;br /&gt;
* the game day, represented as the number of days since 1980-01-01, in the upper bits; and&lt;br /&gt;
* the update-pass number in the low four bits.&lt;br /&gt;
&lt;br /&gt;
The low four bits accommodate the supported range of 1 through 15 updates per day. After processing a planet, ge-next records the current day and pass on that planet. Zygor&#039;s record additionally stores the current scheduler state and the calibrated callback interval, allowing the scheduler to resume after a restart.&lt;br /&gt;
&lt;br /&gt;
Because every planet carries its own progress marker, encountering a record does not automatically mean applying another economic update. ge-next compares the stored day/pass with the current day/pass and computes exactly how many updates are due. Restarting midway through a pass may cause the scanner to revisit earlier records, but their timestamps prevent the same pass from being applied twice.&lt;br /&gt;
&lt;br /&gt;
If a planet is behind because of downtime or an interrupted run, ge-next replays the missing calls to &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt;. Catch-up is limited to the previous seven days so a very old record cannot monopolize one callback with an unlimited amount of historical work. Intermediate catch-up updates run without generating repetitive player mail; only the final live update can send normal notices.&lt;br /&gt;
&lt;br /&gt;
ge-next also stops after completing the configured number of passes for the day. It does not immediately begin an unbounded fifth pass. The scheduler targets completion within 23 hours, leaving time for timing variation.&lt;br /&gt;
&lt;br /&gt;
=== Startup calibration refined in 0.2.2 ===&lt;br /&gt;
ge-next 0.2 initially estimated the delay between planet-update callbacks from the database size at startup. On a new game with very few records, that estimate could be about 1,000 seconds per callback at the default four updates per day. If players then explored and created many more planet records, the first pass could take longer than a day. The scheduler recalculated its callback delay only after finishing a pass, so it never reached the recalculation point; the new planets remained unvisited by that pass.&lt;br /&gt;
&lt;br /&gt;
ge-next 0.2.2 changed the startup estimate from abrupt database-size brackets to a gradual estimate based on the record count. More importantly, [[Game execution flow#Midnight routine|midnight cleanup]] now detects when the first pass has not finished (&amp;lt;code&amp;gt;passnum &amp;amp;lt;= 1&amp;lt;/code&amp;gt;) and clears the saved callback interval on Zygor. On the next startup, the scheduler estimates the interval again using the now-larger database instead of carrying forward the stale value. Once a pass does finish, the normal end-of-pass calibration can take over. This correction does not make the first day immune to rapid growth, but prevents an unfinished first pass from indefinitely blocking recalibration.&lt;br /&gt;
&lt;br /&gt;
== More efficient traversal ==&lt;br /&gt;
The revised routine starts at the planet-record key and remains within the planet portion of the index. It no longer walks every ordinary sector and wormhole record merely to locate the next planet. It can also skip empty or unowned planets while retaining explicit progress through the planet records.&lt;br /&gt;
&lt;br /&gt;
The result is that database growth from exploring empty sectors no longer consumes most of the planetary scheduler&#039;s work. More importantly, the economic state of a planet is determined by its recorded update history, not by whether a process-local cursor happened to reach it often enough.&lt;br /&gt;
&lt;br /&gt;
== Porting guidance ==&lt;br /&gt;
A port should treat planetary production as a scheduled, idempotent job:&lt;br /&gt;
&lt;br /&gt;
* persist a day/period identifier or last-update time on every planet;&lt;br /&gt;
* calculate elapsed periods from that stored value;&lt;br /&gt;
* make revisiting an already processed record harmless;&lt;br /&gt;
* retain enough global state to resume an interrupted pass;&lt;br /&gt;
* impose a documented limit on catch-up work; and&lt;br /&gt;
* traverse a planet-only index or query instead of scanning unrelated sector and wormhole records.&lt;br /&gt;
&lt;br /&gt;
Database iteration order should determine only when a due update is processed, never whether the planet is considered to have experienced the pass at all.&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Planets]]&lt;br /&gt;
[[Category:Classic bugs: Database]]&lt;br /&gt;
[[Category:Classic bugs: Scheduler]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_Planet_record-limit_failure&amp;diff=2160</id>
		<title>Classic bug: Planet record-limit failure</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_Planet_record-limit_failure&amp;diff=2160"/>
		<updated>2026-10-18T17:54:03Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-012&lt;br /&gt;
|affected=Classic 3.2e and published classic source&lt;br /&gt;
|status=Verified in source and observed in a full production database&lt;br /&gt;
|fixed=ge-next 0.3&lt;br /&gt;
|source=GEMAIN.C: gesdb(), getplanetdat(); GEPLANET.C: getsector(), xgetsector(), getplanet()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
Classic Galactic Empire can create incomplete [[Sector|sectors]] when the shared sector/planet/wormhole database reaches &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt;. The sector generator continues building an in-memory sector after one or more database insertions have been refused, and none of the creation callers are told which records were actually saved.&lt;br /&gt;
&lt;br /&gt;
The resulting sector header may advertise planets or wormholes whose child records do not exist. Later code assumes those records exist and can display an unrelated planet left in the global planet workspace. Players observed these as &#039;&#039;[[wikipedia:The_Phantom_Planet|phantom planets]]&#039;&#039;: the sector scan plotted several different planets, but scanning each numbered planet repeatedly displayed the same bearing, distance, environment, and resources. Some reported distances were millions of units. In one test, the phantom planet later changed into Zygor because the periodic planet updater had loaded Zygor into the shared workspace.&lt;br /&gt;
&lt;br /&gt;
The same partial-creation problem can produce one-way wormholes. A saved wormhole can lead to a destination sector or return wormhole that could not be inserted after the record cap was reached.&lt;br /&gt;
&lt;br /&gt;
== What MAXPLREC limits ==&lt;br /&gt;
&amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt; is presented to the sysop as the maximum size of &amp;lt;code&amp;gt;MBMGEPLT.DAT&amp;lt;/code&amp;gt; in KiB. Classic multiplies the configured value by two because every logical record is 512 bytes. The default value of 32,767 therefore becomes a code-level limit of 65,534 records, although the classic configuration text describes it as holding 65,535.&lt;br /&gt;
&lt;br /&gt;
The count includes every record in the shared file, not just planets:&lt;br /&gt;
&lt;br /&gt;
* one sector-header record for every generated sector;&lt;br /&gt;
* one child record for every planet; and&lt;br /&gt;
* one child record for every wormhole.&lt;br /&gt;
&lt;br /&gt;
A sector containing four planets consequently needs five records. Wormhole creation can require still more because the game also creates or updates the destination sector and attempts to install a return wormhole there.&lt;br /&gt;
&lt;br /&gt;
The [[Btrieve]] file on disk can be larger than the configured payload limit due to indexes and other file overhead. The production database involved in the original investigation was 35,716,096 bytes even though the configured &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt; represented approximately 32 MiB of 512-byte records.&lt;br /&gt;
&lt;br /&gt;
== Classic creation sequence ==&lt;br /&gt;
When an unexplored sector is scanned, &amp;lt;code&amp;gt;xgetsector()&amp;lt;/code&amp;gt; constructs the entire sector in global memory before and during a series of separate database writes:&lt;br /&gt;
&lt;br /&gt;
# Randomly decide how many planets the sector will contain and whether any slots are wormholes.&lt;br /&gt;
# Generate each object&#039;s coordinates in the in-memory &amp;lt;code&amp;gt;sector.ptab[]&amp;lt;/code&amp;gt; table.&lt;br /&gt;
# Insert the sector-header record, including &amp;lt;code&amp;gt;numplan&amp;lt;/code&amp;gt; and the complete object table.&lt;br /&gt;
# Build and insert each planet or wormhole as a separate child record.&lt;br /&gt;
# For each new wormhole, create or load its destination sector and add the reciprocal wormhole when a slot is available.&lt;br /&gt;
&lt;br /&gt;
The record-limit check is not performed on this operation as a whole. Instead, classic performs &amp;lt;code&amp;gt;cntrbtv()&amp;lt;/code&amp;gt; inside the low-level &amp;lt;code&amp;gt;gesdb(GEADD)&amp;lt;/code&amp;gt; case before &#039;&#039;every individual insert&#039;&#039;. If the current count is below &amp;lt;code&amp;gt;max_plrec&amp;lt;/code&amp;gt;, that one record is inserted. If the count has reached the cap, the insert is skipped and only an informational &amp;lt;code&amp;gt;Max Sect Reached&amp;lt;/code&amp;gt; message is logged.&lt;br /&gt;
&lt;br /&gt;
The result is not propagated to &amp;lt;code&amp;gt;xgetsector()&amp;lt;/code&amp;gt;. The caller proceeds through all remaining creation steps as though every insertion succeeded.&lt;br /&gt;
&lt;br /&gt;
== Partial sectors near the limit ==&lt;br /&gt;
Suppose the database has room for two more records and the generator chooses a sector with four planets:&lt;br /&gt;
&lt;br /&gt;
# The sector header is inserted. It permanently says that planet slots 1 through 4 exist and stores four plotted coordinates.&lt;br /&gt;
# Planet 1 is inserted into the final available slot.&lt;br /&gt;
# Inserts for planets 2, 3, and 4 are silently refused by the &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt; check.&lt;br /&gt;
&lt;br /&gt;
The database now contains a structurally incomplete sector. A later sector scan reads the valid header and plots all four entries from &amp;lt;code&amp;gt;sector.ptab[]&amp;lt;/code&amp;gt;. A planet scan requests the separate child record. Only planet 1 can be loaded; the other three keys do not exist.&lt;br /&gt;
&lt;br /&gt;
This explains an important visual clue from the live failure: [[Scan command|&amp;lt;code&amp;gt;SCAN SECTOR&amp;lt;/code&amp;gt;]] could show planets in distinct positions while &amp;lt;code&amp;gt;SCAN PLANET 1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SCAN PLANET 2&amp;lt;/code&amp;gt;, and so forth reported identical data. The map was using the planned coordinates saved in the sector header, while the detailed scans were trying and failing to load the missing child records.&lt;br /&gt;
&lt;br /&gt;
If the database is already full before generation begins, none of the new records are saved. The freshly generated sector can still exist temporarily in global memory for the current command, so it may appear real until another operation replaces that workspace. A later scan can generate a different temporary sector for the same coordinates because no persistent sector header was ever written.&lt;br /&gt;
&lt;br /&gt;
== Why missing planets become other planets ==&lt;br /&gt;
Classic uses one global &amp;lt;code&amp;gt;planet&amp;lt;/code&amp;gt; structure as its shared planet record workspace. &amp;lt;code&amp;gt;getplanet()&amp;lt;/code&amp;gt; asks Btrieve to load the requested key into that structure, but on failure it only logs an error. It does not clear &amp;lt;code&amp;gt;planet&amp;lt;/code&amp;gt;, returns the same value on success and failure, and its callers continue by setting &amp;lt;code&amp;gt;plptr&amp;lt;/code&amp;gt; to that same workspace.&lt;br /&gt;
&lt;br /&gt;
The missing planet therefore appears to have the contents of whichever real planet was loaded most recently. Possible sources include:&lt;br /&gt;
&lt;br /&gt;
* an earlier numbered planet scan;&lt;br /&gt;
* another planet-related command;&lt;br /&gt;
* another user&#039;s activity; or&lt;br /&gt;
* the background planetary updater.&lt;br /&gt;
&lt;br /&gt;
This produced several observed forms of the bug:&lt;br /&gt;
&lt;br /&gt;
* every phantom planet in a sector displayed the same bearing and distance;&lt;br /&gt;
* all showed the same environment, resources, population, and stockpiles;&lt;br /&gt;
* bearings and distances changed when another real planet replaced the shared workspace;&lt;br /&gt;
* distances reached millions of units because the stale record belonged to a completely different sector; and&lt;br /&gt;
* after the updater loaded Zygor, a missing planet scan displayed Zygor&#039;s name, ownership, and supplies.&lt;br /&gt;
&lt;br /&gt;
The behavior is not merely cosmetic. &amp;lt;code&amp;gt;getplanetdat()&amp;lt;/code&amp;gt; reports success as long as the requested number appears in the sector header, even when the child lookup failed. Many classic commands then read or manipulate &amp;lt;code&amp;gt;plptr&amp;lt;/code&amp;gt;. Depending on the command and the last record in memory, code intended for the phantom object can inspect or act on an unrelated real planet.&lt;br /&gt;
&lt;br /&gt;
== One-way wormholes ==&lt;br /&gt;
Wormholes expose a second partial-write path. The source sector and its wormhole child can be inserted while space remains, but the database may hit the cap before the destination sector and reciprocal wormhole are saved.&lt;br /&gt;
&lt;br /&gt;
The source wormhole remains usable because its record contains destination coordinates. Traveling through it moves the ship to those coordinates, but the destination can load as an empty, unsaved sector with no return wormhole. During reproduction, logs showed failures while creating the two destination sectors selected for wormholes; entering one of the surviving source wormholes deposited the player in an empty sector.&lt;br /&gt;
&lt;br /&gt;
This is distinct from classic&#039;s intentional behavior when an already-full destination sector has no free object slot. Here, the return path is absent because the database cap interrupted creation.&lt;br /&gt;
&lt;br /&gt;
== Existing sectors ==&lt;br /&gt;
Sectors and child records that were completely saved before the database filled continue to load normally. During the original incident, previously explored sectors retained their correct planet positions and details. The failure affects newly generated sectors and any sectors left partially written as the record count crosses the cap.&lt;br /&gt;
&lt;br /&gt;
Normal updates to existing records are not blocked by &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt;; the defect is specifically in creation and in the handling of missing child records.&lt;br /&gt;
&lt;br /&gt;
== ge-next&#039;s initial fix ==&lt;br /&gt;
The first ge-next fix, committed during 0.3 development, moved a record-count check to the start of &amp;lt;code&amp;gt;xgetsector()&amp;lt;/code&amp;gt;. If an ordinary requested sector did not exist and the database was already at &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt;, ge-next cleared the in-memory sector, filled in the requested coordinates, set &amp;lt;code&amp;gt;numplan&amp;lt;/code&amp;gt; to zero, and returned it as an empty sector without trying to save anything.&lt;br /&gt;
&lt;br /&gt;
This fixed the most common case: once the database was full, scanning another unexplored location no longer generated a temporary table of phantom planets. It was nevertheless incomplete. If the database was merely &#039;&#039;near&#039;&#039; the limit, creation could still begin successfully. The low-level per-record cap could then be reached between the sector header and its later planet or wormhole records. The first fix also prevented a wormhole destination from being completed if the source-sector work consumed the last nominal slots.&lt;br /&gt;
&lt;br /&gt;
Testing immediately demonstrated both remaining cases: a four-object sector whose fourth child did not exist, and saved source wormholes whose destination sectors could not be created.&lt;br /&gt;
&lt;br /&gt;
== Complete creation fix ==&lt;br /&gt;
The follow-up ge-next fix treats &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt; as a soft boundary between complete sector-creation operations rather than a hard boundary between individual record inserts.&lt;br /&gt;
&lt;br /&gt;
It made two coordinated changes:&lt;br /&gt;
&lt;br /&gt;
* The low-level cap was removed from &amp;lt;code&amp;gt;gesdb(GEADD)&amp;lt;/code&amp;gt;. Once sector creation has started, all sector, planet, and wormhole records required by that operation may be inserted.&lt;br /&gt;
* The start-of-sector guard remains for ordinary exploration, but wormhole destination creation bypasses it so the reciprocal side of a wormhole can be completed.&lt;br /&gt;
&lt;br /&gt;
The database may therefore exceed the configured target by the records needed to finish the sector and any wormhole destinations already in progress. Afterward, the next attempt to generate an unrelated unexplored sector sees that the count is at or above the limit and returns a consistent empty sector. A small, bounded overshoot is preferable to permanently saving a header that references nonexistent children or a wormhole with no generated destination.&lt;br /&gt;
&lt;br /&gt;
== Later defensive hardening ==&lt;br /&gt;
Before the final ge-next 0.3 release, planet lookup was also hardened so a missing record is safe regardless of its cause:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;getplanet()&amp;lt;/code&amp;gt; clears the global planet workspace before lookup;&lt;br /&gt;
* it returns &amp;lt;code&amp;gt;FALSE&amp;lt;/code&amp;gt; when the requested key does not exist and &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; only after a real record is loaded;&lt;br /&gt;
* &amp;lt;code&amp;gt;getplanetdat()&amp;lt;/code&amp;gt; propagates that result instead of treating the sector header as proof that the child exists; and&lt;br /&gt;
* scans, orbit administration, transfers, trade, beacons, planetary weapons, and other callers stop their operation when the load fails.&lt;br /&gt;
&lt;br /&gt;
This defense prevents stale Zygor data, another player&#039;s last planet, or any other previous workspace contents from masquerading as a missing planet even if a database becomes inconsistent for some reason unrelated to &amp;lt;code&amp;gt;MAXPLREC&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Discovery transcript ==&lt;br /&gt;
[[Discovery transcript: GE-BUG-012|Read the Discord discussion and tests that uncovered this bug]].&lt;br /&gt;
&lt;br /&gt;
== Porting guidance ==&lt;br /&gt;
Sector generation should be atomic at the logical level. A port should use a transaction where available, or reserve enough capacity before writing the sector header and all of its children. The header must never advertise an object until that object&#039;s backing record is guaranteed to exist.&lt;br /&gt;
&lt;br /&gt;
Wormholes require the same rule across both ends: either create a valid destination and reciprocal link, or do not expose the source wormhole.&lt;br /&gt;
&lt;br /&gt;
Every record-loading function should also:&lt;br /&gt;
&lt;br /&gt;
* initialize or invalidate its destination before lookup;&lt;br /&gt;
* return an explicit success/failure result;&lt;br /&gt;
* require callers to check that result; and&lt;br /&gt;
* avoid shared stale state being interpreted as newly loaded data.&lt;br /&gt;
&lt;br /&gt;
Silently refusing one write in the middle of a multi-record object is not a safe implementation of a database-size limit.&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: Planets]]&lt;br /&gt;
[[Category:Classic bugs: Database]]&lt;br /&gt;
[[Category:Classic bugs: Wormholes]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Ge-next_installation&amp;diff=2159</id>
		<title>Ge-next installation</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Ge-next_installation&amp;diff=2159"/>
		<updated>2026-10-18T17:54:01Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ge-next installation}}&lt;br /&gt;
This page gives the ge-next-specific choices and filenames. For the shared installation, backup, and rollback procedure, begin with [[Installing Galactic Empire]]; for saved files and resets, see [[Database files]].&lt;br /&gt;
&lt;br /&gt;
== Choose a release ==&lt;br /&gt;
* [https://github.com/manicpop/ge-next/releases 16-bit ge-next releases] are for DOS MajorBBS/Worldgroup and [[MBBSEmu]]. Since ge-next 0.3.2, MBBSEmu uses the normal 16-bit package; it requires MBBSEmu v1.0-alpha-090826 or newer. See [[Running Galactic Empire with MBBSEmu]] for emulator setup.&lt;br /&gt;
* [https://github.com/manicpop/ge-next32/releases 32-bit ge-next releases] are for The Major BBS V10, not MBBSEmu.&lt;br /&gt;
&lt;br /&gt;
Choose a &#039;&#039;&#039;full release archive&#039;&#039;&#039; for a new installation. Both architectures present themselves as ge-next and are intended to have the same gameplay; &amp;lt;code&amp;gt;PROJECT_ARCH&amp;lt;/code&amp;gt; identifies the build in version and DATA output. They have different database layouts, so do not substitute one architecture&#039;s saved files for the other&#039;s. The release DLL is ready to install; source compilation is not required.&lt;br /&gt;
&lt;br /&gt;
[[ge-arena]] is a separate module and download, despite sharing ge-next&#039;s source tree. Its &amp;lt;code&amp;gt;MPOGA*&amp;lt;/code&amp;gt; files are not an upgrade to or replacement for ge-next&#039;s &amp;lt;code&amp;gt;MPOGE*&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== ge-next package contents ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Files !! ge-next-specific role&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MPOGEMP.DLL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGEMP.MDF&amp;lt;/code&amp;gt; || Module and definition. The MDF identifies &amp;lt;code&amp;gt;MPOGEMSG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGEHLP&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;MPOGESHP&amp;lt;/code&amp;gt; as its message resources.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MPOGEMSG.MSG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGEHLP.MSG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGESHP.MSG&amp;lt;/code&amp;gt; || Main settings/messages, help, and ship classes. Full release archives ship these sources, not precompiled MCV files; use the host&#039;s message compilation procedure. See [[Configuring Galactic Empire]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MPOGEUSR.DAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGESHP.DAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGEPLT.DAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGEMAL.DAT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MPOGETEA.DAT&amp;lt;/code&amp;gt; || Supplied starting files and, after play begins, the live game. The team file is text; the others are [[Btrieve]] files. [[Database files]] explains how to back up or reset the entire set.&lt;br /&gt;
|-&lt;br /&gt;
| Matching &amp;lt;code&amp;gt;*.NEW&amp;lt;/code&amp;gt; (16-bit) or &amp;lt;code&amp;gt;*.VIR&amp;lt;/code&amp;gt; (32-bit) || Clean templates for an intentional new game, not a step in a routine upgrade.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MPOGEMNU.TXT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RELNOTES.TXT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FRONTEND.TXT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LICENSE.txt&amp;lt;/code&amp;gt; || Menu text, release notes, DATA frontend reference, and license. The 16-bit archive also includes optional &amp;lt;code&amp;gt;RLTELNET.SH&amp;lt;/code&amp;gt; and a linker &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; file.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The 16-bit archive retains DOS 8.3 filenames. Keep the files from one release together, including any compiled message resources generated from its MSG sources.&lt;br /&gt;
&lt;br /&gt;
== Activating the module ==&lt;br /&gt;
Use &amp;lt;code&amp;gt;MPOGEMP.MDF&amp;lt;/code&amp;gt; when adding ge-next to a MajorBBS/Worldgroup menu. With MBBSEmu, use module identifier &amp;lt;code&amp;gt;MPOGEMP&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;modules.json&amp;lt;/code&amp;gt; and point its path at the 16-bit package; [[Running Galactic Empire with MBBSEmu]] covers the rest of that setup. Review &amp;lt;code&amp;gt;MPOGEMSG.MSG&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MPOGESHP.MSG&amp;lt;/code&amp;gt; before admitting players, then compile all three message sources for the installed DLL. The full archive already has starting &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files; copying templates over them is unnecessary.&lt;br /&gt;
&lt;br /&gt;
The general [[Installing Galactic Empire#Install a new game|installation checklist]] covers host startup and first-use testing. Do not replace a running game&#039;s &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files merely because a new full archive contains fresh ones.&lt;br /&gt;
&lt;br /&gt;
== ge-next upgrade boundary ==&lt;br /&gt;
ge-next 0.3 renamed the module and data from &amp;lt;code&amp;gt;MBM*&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MPO*&amp;lt;/code&amp;gt; and changed persistent structures. Saved games from earlier ge-next releases are &#039;&#039;&#039;not&#039;&#039;&#039; directly compatible with 0.3 or later. For later upgrades, read every intervening &amp;lt;code&amp;gt;RELNOTES.TXT&amp;lt;/code&amp;gt;; a patch archive may omit files expected to be present from its specified base release.&lt;br /&gt;
&lt;br /&gt;
Use [[Installing Galactic Empire#Upgrade or roll back|the shared upgrade procedure]] for backups, merging local MSG changes, preserving live DAT files, and rollback. MBBSEmu installations also have live SQLite &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; files; [[Database files#MBBSEmu|Database files]] explains their handling. Neither the clean templates nor the starting DAT files in a new archive are a migration tool.&lt;br /&gt;
&lt;br /&gt;
== ge-next checks ==&lt;br /&gt;
In the game, &amp;lt;code&amp;gt;HELP VERSION&amp;lt;/code&amp;gt; should show the intended ge-next version and architecture. If a frontend uses [[Data command|DATA]], verify its pairing and reported project metadata against &amp;lt;code&amp;gt;FRONTEND.TXT&amp;lt;/code&amp;gt;. The ordinary menu, ship, scan, roster, persistence, and host-log checks are listed on [[Installing Galactic Empire#Install a new game|the general installation page]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Installing Galactic Empire]]&lt;br /&gt;
* [[Database files]]&lt;br /&gt;
* [[Configuring Galactic Empire]]&lt;br /&gt;
* [[Running Galactic Empire with MBBSEmu]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:ge-next]]&lt;br /&gt;
[[Category:Sysop documentation]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Sys_command&amp;diff=2157</id>
		<title>Sys command</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Sys_command&amp;diff=2157"/>
		<updated>2026-10-18T17:53:56Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;SYS&#039;&#039;&#039; command provides privileged diagnostic and administrative controls from inside Galactic Empire. These are not normal gameplay commands: many of them bypass prices, cargo capacity, travel, proximity, or ship-class restrictions, and some can deliberately place game records into combinations that normal play could never produce.&lt;br /&gt;
&lt;br /&gt;
Classic GE describes the commands as debugging aids and warns that they can give a player a distinct advantage. A production game should therefore limit them to trusted administrators.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
SYS HELP&lt;br /&gt;
SYS subcommand [arguments]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SYS HELP&amp;lt;/code&amp;gt; displays the subcommands documented by the installed version. ge-next also makes the same text available through [[Help command|&amp;lt;code&amp;gt;HELP SYS&amp;lt;/code&amp;gt;]], but only to a user who is authorized to use &amp;lt;code&amp;gt;SYS&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Access control ==&lt;br /&gt;
Three configuration settings govern access:&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;SYSCMDS&amp;lt;/code&amp;gt;&lt;br /&gt;
: Enables or disables the command as a whole.&lt;br /&gt;
; &amp;lt;code&amp;gt;SYSONLY&amp;lt;/code&amp;gt;&lt;br /&gt;
: When enabled, restricts the command to users who pass the board&#039;s sysop authorization test. Turning it off makes these powerful commands available to ordinary players and is not recommended.&lt;br /&gt;
; &amp;lt;code&amp;gt;SYSKEY&amp;lt;/code&amp;gt;&lt;br /&gt;
: On MajorBBS 6.x and later systems, identifies the key required for SYS access. It defaults to &amp;lt;code&amp;gt;SYSOP&amp;lt;/code&amp;gt;, but an administrator can define a dedicated key such as &amp;lt;code&amp;gt;GEOP&amp;lt;/code&amp;gt; and give it to selected game operators. MajorBBS 5.x builds instead test the account&#039;s built-in sysop flag.&lt;br /&gt;
&lt;br /&gt;
Authorization is checked before any subcommand is interpreted. Classic GE responds &amp;lt;code&amp;gt;Huh?&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;SYS&amp;lt;/code&amp;gt; is disabled or the user is unauthorized; it also uses that response for an unrecognized SYS subcommand. ge-next instead returns its ordinary invalid-command message for disabled or unauthorized SYS use, making it look like an actual invalid game command rather than acknowledging a special command.&lt;br /&gt;
&lt;br /&gt;
== Classic subcommands ==&lt;br /&gt;
These are the active SYS subcommands in classic GE 3.2e. All remain available in standard ge-next, with the noted changes. There are no active classic-only SYS subcommands in this version; old Cybertron test branches in the classic source are compiled out.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Syntax !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS HELP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Displays the available SYS commands.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS GET [amount] [item]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Adds the requested item directly to the current ship. It does not enforce cargo capacity, purchase price, or normal acquisition rules.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS KILL [user]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sets every matching active ship above the destruction threshold. Destruction then proceeds through the game&#039;s normal ship-destruction processing.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS CASH [amount]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Changes the current user&#039;s cash. Classic requires an amount and adds it directly. ge-next permits a negative amount to remove cash without going below zero, prevents overflow, and fills cash to its supported maximum when the amount is omitted.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS GOTO [x] [y]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Teleports the current ship to the center of the specified sector and clears its hostility timer. ge-next validates both positive and negative coordinates against the actual galaxy radius; classic&#039;s one-sided test can accept invalid negative coordinates and rejects the positive outer edge.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS CLASS [number]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Changes the current ship&#039;s class and top speed. It does not construct a new ship or automatically reconcile every existing system and inventory value with the new class. ge-next also rejects disabled or invalid class entries.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS SHIELDTYPE [number]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Directly changes the installed shield class. ge-next rejects negative values.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS PHASERTYPE [number]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Directly changes the installed phaser class. ge-next rejects negative values.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS MAINT&amp;lt;/code&amp;gt;&lt;br /&gt;
| Classic starts its special fast-maintenance path and immediately performs a repair pass. ge-next starts ordinary timed maintenance without requiring planetary orbit, but still refuses while the ship&#039;s combat timer is active.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS UNJAM&amp;lt;/code&amp;gt;&lt;br /&gt;
| Removes the current ship&#039;s jamming effect immediately. ge-next clears its separate jamming-severity and duration fields.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS LIST [number]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Displays as many as 50 occupied live-ship slots, beginning at the optional slot number. Classic shows channel, identity, sector, damage, update tick, and Cybertron target. ge-next adds course-control, Cybertron-update, and last-attacker state useful for debugging combat and NPC behavior.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS CLASSLIST&amp;lt;/code&amp;gt;&lt;br /&gt;
| Lists the loaded ship classes and selected NPC-allocation fields, including whether Cybertrons may attack the class and its configured pursuit count.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS CYBPAUSE [seconds]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Suspends Cybertron processing for the specified number of seconds.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Classic &amp;lt;code&amp;gt;SYS MAINT&amp;lt;/code&amp;gt; has several rough edges. It prints the normal maintenance-start message, whose &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt; [[Centock|centock]] placeholder expects a repair-time argument, but this call supplies none; the displayed number is therefore undefined stack data, not a real estimate. The command sets the repair flag and runs only one repair pass immediately, rather than completing all repairs at once; later passes occur on ship-state updates. It prints that start message even while the battle-exit restriction is active, after which &amp;lt;code&amp;gt;repairship()&amp;lt;/code&amp;gt; immediately cancels the work. On an undamaged ship, the immediate pass still reaches the completion path, lowering the shields and clearing their charge.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SYS CLASS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS SHIELDTYPE&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SYS PHASERTYPE&amp;lt;/code&amp;gt; are direct diagnostic edits rather than purchases. They do not charge the user and should not be assumed to enforce the normal class table, upgrade eligibility, or installation side effects.&lt;br /&gt;
&lt;br /&gt;
== ge-next-only subcommands ==&lt;br /&gt;
The following operations are not in classic GE 3.2e. The in-game &amp;lt;code&amp;gt;SYS HELP&amp;lt;/code&amp;gt; list contains the commonly useful controls; a few low-level inspection commands are accepted without being advertised there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Syntax !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS MAINT NOW&amp;lt;/code&amp;gt;&lt;br /&gt;
| Immediately completes all maintenance without waiting for the normal repair process.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS FACTIONS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Displays the current user&#039;s standing with each of the eight factions.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS NEBSEED&amp;lt;/code&amp;gt;&lt;br /&gt;
| Displays the seed from which the current nebula layout is derived.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS FILLSLOTS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Populates every vacant NPC slot according to the currently loaded Cybertron and Droid class allotments. It is useful after changing allocations or while diagnosing the NPC population.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS MIDNIGHT&amp;lt;/code&amp;gt;&lt;br /&gt;
| Runs GE&#039;s midnight housekeeping routine immediately. This is a debugging control, not a substitute for the board&#039;s scheduled cleanup.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS TEAMDUMP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Displays the in-memory team records, including internal identifiers, member counts, deletion dates, passwords, and founder secrets. ge-next 0.3 moved this sensitive diagnostic output from classic&#039;s undocumented, unprivileged &amp;lt;code&amp;gt;TEAM DUMPITOUT&amp;lt;/code&amp;gt; to SYS.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS MULTIPLY [number]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Runs from one to 50 production cycles on the inhabited planet currently being orbited, then saves the planet. It refuses planets without a population and owner.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS ORBIT [planet]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Places the ship in orbit around a numbered planet in its present sector without enforcing the normal distance requirement. It cannot orbit a wormhole. ge-next also stops the ship and displays the planet&#039;s update timestamp for diagnostics.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS ASSIGNCYBS&amp;lt;/code&amp;gt;&lt;br /&gt;
| Reassigns the Cybertrons pursuing the current player according to ge-next&#039;s distance-based pursuit selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYS FILL [amount]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Sets every item slot in the current ship to the requested quantity. Omitting the amount uses the largest supported item quantity. Unlike &amp;lt;code&amp;gt;SYS GET&amp;lt;/code&amp;gt;, this replaces every item quantity rather than adding one selected item.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SYS MULTIPLY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS ORBIT&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SYS MIDNIGHT&amp;lt;/code&amp;gt; were introduced in ge-next 0.1. Later releases added the NPC inspection and assignment controls as the Cybertron and Droid allocation systems were corrected and expanded.&lt;br /&gt;
&lt;br /&gt;
== ge-arena ==&lt;br /&gt;
ge-arena retains SYS authorization and permits an authorized operator to enter the command from the lobby. Only &amp;lt;code&amp;gt;SYS HELP&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SYS CLASSLIST&amp;lt;/code&amp;gt; work there; the class list is limited to ships configured for the selected arena mode.&lt;br /&gt;
&lt;br /&gt;
The following commands require an active match, an operator participating in that match, and a selected ship:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
SYS NEBSEED       SYS GET          SYS KILL&lt;br /&gt;
SYS GOTO          SYS CLASS        SYS SHIELDTYPE&lt;br /&gt;
SYS PHASERTYPE    SYS MAINT        SYS UNJAM&lt;br /&gt;
SYS LIST          SYS ORBIT        SYS FILL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Persistent-game or unsupported controls are disabled in ge-arena. These include &amp;lt;code&amp;gt;SYS FACTIONS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS FILLSLOTS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS CASH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS MIDNIGHT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS TEAMDUMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS CYBPAUSE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SYS MULTIPLY&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SYS ASSIGNCYBS&amp;lt;/code&amp;gt;. The restrictions prevent an operator in the lobby from modifying nonexistent ship state and exclude systems that ge-arena deliberately does not persist.&lt;br /&gt;
&lt;br /&gt;
== Operational cautions ==&lt;br /&gt;
* Make a backup before using commands that alter persistent users, planets, or world state.&lt;br /&gt;
* Do not use &amp;lt;code&amp;gt;SYS GET&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SYS FILL&amp;lt;/code&amp;gt; to test normal cargo limits; bypassing those limits is their purpose.&lt;br /&gt;
* Do not assume a ship produced by &amp;lt;code&amp;gt;SYS CLASS&amp;lt;/code&amp;gt; is equivalent to a normally purchased ship of that class.&lt;br /&gt;
* Treat &amp;lt;code&amp;gt;SYS TEAMDUMP&amp;lt;/code&amp;gt; output as confidential.&lt;br /&gt;
* Check logs after SYS commands that write records; a success message alone does not establish that a [[Btrieve]] update succeeded.&lt;br /&gt;
* Leave &amp;lt;code&amp;gt;SYSONLY&amp;lt;/code&amp;gt; enabled unless deliberately running a controlled test in which every participant may use administrative commands.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Sysop documentation]]&lt;br /&gt;
* [[Help command]]&lt;br /&gt;
* [[Maintenance command|Maintenance]]&lt;br /&gt;
* [[Cybertrons]]&lt;br /&gt;
* [[Planetary production]]&lt;br /&gt;
* [[Classic bug: SYS GOTO desynchronizes warp state]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:Sysop documentation]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Original_release_history&amp;diff=2155</id>
		<title>Original release history</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Original_release_history&amp;diff=2155"/>
		<updated>2026-10-18T17:53:52Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The surviving original release history is preserved in [[GEREADME.DOC]]. Its dated entries run from version 2.0a on April 29, 1989, through version 3.2e on August 6, 1994. The 2.0a notes explicitly describe that release as a revision of version 1.4; the earlier releases are not dated in this changelog.&lt;br /&gt;
&lt;br /&gt;
== Release chronology ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Release !! Date in surviving notes !! Historical significance&lt;br /&gt;
|-&lt;br /&gt;
| 1.4 and earlier || Before April 1989; dates not established here || 2.0a names 1.4 as its predecessor. Elwynor&#039;s retrospective history traces the titles &#039;&#039;Galactic War&#039;&#039;, &#039;&#039;Galactic Raiders&#039;&#039;, and &#039;&#039;Galactic Empire&#039;&#039;, but does not date each change.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#04/29/89_Release_2.0a|2.0a]] || April 29, 1989 || First official 2.0 release outside beta; added Cybertron opponents, multiple ship classes and fleets, and kill-focused scoring.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#05/01/89_Release_2.0b|2.0b]]–[[GEREADME.DOC#12/01/89_Release_2.0n|2.0n]] || May–December 1989 || Frequent combat, economy, scanner, and scoring adjustments. The notes record changes to galaxy-edge behavior and a random starting point for planetary updates.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#01/10/90_Release_2.1a|2.1a]]–[[GEREADME.DOC#03/22/90_Release_2.1e|2.1e]] || January–March 1990 || New planet-based scoring and roster details, database changes, [[Btrieve]] and cleanup work, and further combat fixes. A 2.1f entry is explicitly marked &#039;&#039;not released&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#06/15/90_Release_2.2a_BETA_(NOT_GENERALLY_RELEASED)|2.2a]]–[[GEREADME.DOC#09/09/90_Release_2.2e|2.2e]] || June–September 1990 || Early beta releases followed by wider releases; 2.2c added colorized screens, revised scans, and moved the neutral zone to sector 290.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#07/23/91_Release_2.3a|2.3a]]–[[GEREADME.DOC#02/08/92_Release_2.3g|2.3g]] || July 1991–February 1992 || More configurable planet ownership and transfer rules, mines and jammers, Cyberquads, and working zippers by 2.3g.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#07/15/92_Release_3.0a_(BETA_RELEASE)|3.0a]] || July 15, 1992 || Beta debut of the on-demand Virtual Galaxy, sector 0 0 neutral zone, wormholes, scanner locks, navigation aids, and terminal-program support.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#08/30/92_Release_3.0b_(STILL_BETA)|3.0b]]–[[GEREADME.DOC#09/11/92_Release_3.0d_(BETA_to_go)|3.0d]] || August–September 1992 || 3.0b added MajorBBS 6.0 DLL support; 3.0c activated Droid ships and explicit shield controls; 3.0d added registration protection for general release.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#11/01/92_Release_3.0l_(General_Release_-_NOT_BETA!!)|3.0l]]–[[GEREADME.DOC#2/5/93_Release_3.0p|3.0p]] || November 1992–February 1993 || 3.0l is labeled a general, non-beta release. Later notes added self-destruct blast damage, &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; support, and additional neutral-zone planet configuration.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#7/4/93_Release_3.1b|3.1b]] || July 4, 1993 || New database keys and registration code, protected-memory allocation for systems above 128 users, expanded ship options, and warp overspeed.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#12/14/93_Release_3.2c|3.2c]] and [[GEREADME.DOC#Patch_level_6_(3.2c.6)_2/8/94|patches]] || December 14, 1993–February 8, 1994 || Scoring and stock-default rebalance, database reset, and six documented patch levels covering spies, cloak, shields, missiles, and planetary updates.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#03/06/94_Release_3.2d|3.2d]] || March 6, 1994 || Configurable item/phaser/shield prices, revised fighter attacks, optional command headings, stronger phasers, wormhole projectile cleanup, and &amp;lt;code&amp;gt;SET FILTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| [[GEREADME.DOC#08/06/94_Release_3.2e|3.2e]] || August 6, 1994 || Per-class Cybertron and Droid messages and corrected high-warp display; last release recorded in the supplied classic notes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The table highlights milestones, not every letter release or patch. In particular, a dated note records what the developer intended to release; it does not by itself prove that every described correction worked in the final code. The [[Classic bug database]] documents surviving discrepancies.&lt;br /&gt;
&lt;br /&gt;
== Installation and compatibility ==&lt;br /&gt;
Several releases required new databases, a database conversion, a fresh registration code, or coordinated changes to the MSG and ship-class files. The 3.2c base release explicitly required resetting all databases after a ship-table field-size error; 3.1b required new empty databases and registration information. An operator upgrading a historical system should read that release&#039;s installation notes rather than assume that a same-series update is data-compatible.&lt;br /&gt;
&lt;br /&gt;
== Later history ==&lt;br /&gt;
The 1994 endpoint belongs to the original MBM release line. Elwynor Technologies&#039; later Worldgroup and MajorBBS ports, and the separately developed ge-next line, are covered under [[History of Galactic Empire]] and [[Versions of Galactic Empire]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[GEREADME.DOC]]&lt;br /&gt;
* [[Versions of Galactic Empire]]&lt;br /&gt;
* [[Classic Galactic Empire]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:History]]&lt;br /&gt;
[[Category:Versions]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=MajorBBS_integration&amp;diff=2154</id>
		<title>MajorBBS integration</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=MajorBBS_integration&amp;diff=2154"/>
		<updated>2026-10-18T17:53:51Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Galactic Empire&#039;&#039;&#039; (GE) is a MajorBBS module, not a standalone server. MajorBBS loads the game, routes users&#039; input to it, supplies channel and account information, runs its scheduled callbacks, formats and sends its output, and provides database services. Understanding that boundary is useful when reading GE&#039;s source or porting it to another host.&lt;br /&gt;
&lt;br /&gt;
== Loading and registration ==&lt;br /&gt;
The 16-bit source supports two MajorBBS integration paths:&lt;br /&gt;
* &#039;&#039;&#039;MajorBBS 5.x:&#039;&#039;&#039; GE is linked into the BBS and enters its common startup routine, &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt;, through &amp;lt;code&amp;gt;iniwar()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;MajorBBS 6.x (Phar Lap):&#039;&#039;&#039; The BBS loads GE as a DLL and calls its exported &amp;lt;code&amp;gt;init__galemp()&amp;lt;/code&amp;gt; initializer. That initializer reads the module description from the game&#039;s MDF file, calls &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt;, then passes GE&#039;s &amp;lt;code&amp;gt;struct module&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;register_module()&amp;lt;/code&amp;gt;. The returned module state code is stored in &amp;lt;code&amp;gt;gestt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The MDF supplies the name used by the BBS Menu Tree. GE uses &amp;lt;code&amp;gt;gmdnam()&amp;lt;/code&amp;gt; to copy that name into the module registration block; the developer&#039;s guide warns that a mismatch between the registered description and the MDF name makes the module inaccessible through the menu. Registration by itself does not put the game in a user&#039;s menu: the sysop must also link the module into the Menu Tree. Classic names its module block &amp;lt;code&amp;gt;mbmge&amp;lt;/code&amp;gt;. ge-next uses &amp;lt;code&amp;gt;mpoge&amp;lt;/code&amp;gt;, while ge-arena uses &amp;lt;code&amp;gt;mpoga&amp;lt;/code&amp;gt;; those builds also have separate MDF and resource files so they can run alongside classic and one another.&lt;br /&gt;
&lt;br /&gt;
Common startup in &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt; opens the compiled message bank, reads configuration options, opens [[Btrieve]] files, loads ship classes and other game data, allocates in-memory tables, and starts recurring work with &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt;. The 5.x and 6.x routes differ in how the host reaches GE, not in the main game initialization they perform.&lt;br /&gt;
&lt;br /&gt;
== The module interface ==&lt;br /&gt;
MajorBBS&#039;s &amp;lt;code&amp;gt;struct module&amp;lt;/code&amp;gt; contains a description and nine callback slots. GE fills them as follows in its 6.x registration block (the 5.x build uses corresponding host entry points):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Host event !! GE routine !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Supplemental logon || &amp;lt;code&amp;gt;gelogon()&amp;lt;/code&amp;gt; || Optional GE message while a user logs on to the BBS.&lt;br /&gt;
|-&lt;br /&gt;
| Module input || &amp;lt;code&amp;gt;galemp()&amp;lt;/code&amp;gt; || Handles menu selections, prompts, and gameplay commands while the user is in GE.&lt;br /&gt;
|-&lt;br /&gt;
| Status input || &amp;lt;code&amp;gt;stshdlr()&amp;lt;/code&amp;gt; || Handles host status input while GE is selected.&lt;br /&gt;
|-&lt;br /&gt;
| Injected-other input || &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; || GE does not install a special &amp;lt;code&amp;gt;injoth&amp;lt;/code&amp;gt; handler.&lt;br /&gt;
|-&lt;br /&gt;
| Supplemental logoff || &amp;lt;code&amp;gt;pwarlof()&amp;lt;/code&amp;gt; || Receives the BBS logoff event. In ge-next, it also clears the session&#039;s &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; state.&lt;br /&gt;
|-&lt;br /&gt;
| Carrier loss / hangup || &amp;lt;code&amp;gt;pwarhup()&amp;lt;/code&amp;gt; || Handles an abrupt disconnect, including any needed ship cleanup.&lt;br /&gt;
|-&lt;br /&gt;
| Midnight cleanup || &amp;lt;code&amp;gt;pgemidnight()&amp;lt;/code&amp;gt; || Runs GE&#039;s daily maintenance work.&lt;br /&gt;
|-&lt;br /&gt;
| Account deletion || &amp;lt;code&amp;gt;pgedelete()&amp;lt;/code&amp;gt; || Removes that user&#039;s GE records when the BBS deletes the account.&lt;br /&gt;
|-&lt;br /&gt;
| System shutdown || &amp;lt;code&amp;gt;pclswar()&amp;lt;/code&amp;gt; || Closes GE resources as the BBS shuts down.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The logon, logoff, hangup, midnight, deletion, and shutdown hooks are host lifecycle events, not commands the player types. The main input callback is different: MajorBBS calls it when a user selects GE and after subsequent input lines. Returning zero leaves the module and returns the user to the parent menu.&lt;br /&gt;
&lt;br /&gt;
== Channels and input state ==&lt;br /&gt;
For user-facing callbacks, MajorBBS supplies globals including &amp;lt;code&amp;gt;usrnum&amp;lt;/code&amp;gt; (the current channel), &amp;lt;code&amp;gt;usrptr&amp;lt;/code&amp;gt; (its live user state), and &amp;lt;code&amp;gt;usaptr&amp;lt;/code&amp;gt; (account information). &amp;lt;code&amp;gt;usrptr-&amp;gt;state&amp;lt;/code&amp;gt; identifies the selected module; &amp;lt;code&amp;gt;usrptr-&amp;gt;substt&amp;lt;/code&amp;gt; identifies the current prompt or input substate within that module. GE&#039;s &amp;lt;code&amp;gt;galemp()&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;substt&amp;lt;/code&amp;gt; to dispatch to the appropriate menu or gameplay handler. It also establishes pointers to the current channel&#039;s GE ship and user entries through &amp;lt;code&amp;gt;warshpoff(usrnum)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;warusroff(usrnum)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A channel number is a live connection slot, not a permanent player identity. Slots can be reused after a user disconnects; persistent GE records are keyed separately. GE also uses globals as working storage for the current callback. That is ordinary in the single-threaded MajorBBS execution model, but a port cannot treat those globals as independent per-user state or assume a pointer remains valid for a different callback.&lt;br /&gt;
&lt;br /&gt;
== Timed and lifecycle work ==&lt;br /&gt;
During startup, GE schedules recurring callbacks with &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt;. Those callbacks process ship movement, automatic systems, Cybertrons and other NPC activity, and planetary updates at different intervals. The 5.x and 6.x builds use different callback wrappers where their required function signatures differ. A callback schedules its next run; the host is not executing a separate GE thread. See [[Game timing]] and [[Game execution flow]] for the full sequence.&lt;br /&gt;
&lt;br /&gt;
The BBS calls GE&#039;s registered [[Game execution flow#Midnight routine|midnight routine]] for daily game maintenance. Separately, when the BBS disconnects users for its own cleanup, it calls GE&#039;s hangup routine. Classic GE treats that hangup like an ordinary disconnect, so a ship still engaged in combat can be lost. MajorBBS provides &amp;lt;code&amp;gt;rsmodes&amp;lt;/code&amp;gt; to indicate that a channel is being reset. ge-next checks it on the hangup path and, when the BBS is disconnecting a combat-locked user for cleanup, saves the ship instead of destroying it.&lt;br /&gt;
&lt;br /&gt;
== Output and message resources ==&lt;br /&gt;
GE&#039;s MSG source is compiled into MCV resource files. &amp;lt;code&amp;gt;opnmsg()&amp;lt;/code&amp;gt; opens a bank, &amp;lt;code&amp;gt;setmbk()&amp;lt;/code&amp;gt; selects it, and &amp;lt;code&amp;gt;prfmsg()&amp;lt;/code&amp;gt; formats a named message into the host&#039;s &amp;lt;code&amp;gt;prfbuf&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;outprf()&amp;lt;/code&amp;gt; sends the formatted text to a channel; &amp;lt;code&amp;gt;clrprf()&amp;lt;/code&amp;gt; discards it. The buffer and its write pointer are shared formatting state, &#039;&#039;&#039;not one independent PRF buffer per channel&#039;&#039;&#039;. GE must select the right bank and explicitly send, reuse, or clear the buffer as it delivers messages to different users. A careless clear or send can hide a message or deliver it to the wrong audience. See [[Configuring Galactic Empire]].&lt;br /&gt;
&lt;br /&gt;
== Persistent data ==&lt;br /&gt;
GE stores users, ships, sectors and planets, and other game records through the host&#039;s Btrieve API. Startup opens the files with the expected record sizes; later operations select a file and use its position block, data buffer, key, operation, and key number. The in-memory channel tables are separate from those persistent records. A port or emulator must preserve the relevant Btrieve key and update behavior, not merely the visible data fields. See [[Data structures]] and [[MBBSEmu]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Game execution flow]]&lt;br /&gt;
* [[Game timing]]&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
* [[Porting Galactic Empire]]&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
* [https://download.mbbsemu.com/docs/MajorBBS_Developers_Guide_Rev_6.2_Jan_1994.pdf &#039;&#039;The Major BBS Developer&#039;s Guide&#039;&#039;, revision 6.2 (January 1994)], particularly the chapters on module initialization, &amp;lt;code&amp;gt;register_module()&amp;lt;/code&amp;gt;, user state, and PRF output.&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Platforms]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Database_files&amp;diff=2153</id>
		<title>Database files</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Database_files&amp;diff=2153"/>
		<updated>2026-10-18T17:53:49Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Galactic Empire&#039;&#039;&#039; keeps its saved game in files beside the module. A sysop should know which files belong together, which clean templates to retain, and which files to restore when starting a new game. For field layouts and [[Btrieve]] keys, see [[Data structures]]; this page covers the files as an operational set.&lt;br /&gt;
&lt;br /&gt;
== Game files ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Purpose !! Classic GE !! Elwynor GE !! ge-next (0.3+)&lt;br /&gt;
|-&lt;br /&gt;
| Players, preferences, scores || &amp;lt;code&amp;gt;MBMGEUSR.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ELWGEUSR.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MPOGEUSR.DAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Persistent player ships || &amp;lt;code&amp;gt;MBMGESHP.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ELWGESHP.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MPOGESHP.DAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Discovered sectors, planets, wormholes || &amp;lt;code&amp;gt;MBMGEPLT.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ELWGEPLT.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MPOGEPLT.DAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| In-game mail || &amp;lt;code&amp;gt;MBMGEMAL.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ELWGEMAL.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MPOGEMAL.DAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Teams || &amp;lt;code&amp;gt;MBMGETEA.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ELWGETEA.DAT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;MPOGETEA.DAT&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;USR&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SHP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PLT&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;MAL&amp;lt;/code&amp;gt; files are Btrieve databases. Despite its &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; extension, the &amp;lt;code&amp;gt;TEA&amp;lt;/code&amp;gt; file is &#039;&#039;&#039;not&#039;&#039;&#039; a Btrieve database: it is GE&#039;s fixed-width text team table. Keep it with the rest of the saved game when backing up or resetting. ge-arena uses only its own &amp;lt;code&amp;gt;MPOGAUSR.DAT&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MPOGAPLT.DAT&amp;lt;/code&amp;gt;; it does not use persistent ship, mail, or team files.&lt;br /&gt;
&lt;br /&gt;
These game variants have distinct file prefixes. Do not merge their directories or substitute one variant&#039;s data files for another&#039;s. In particular, a classic &amp;lt;code&amp;gt;MBMGEUSR.DAT&amp;lt;/code&amp;gt; is not an in-place replacement for a ge-next &amp;lt;code&amp;gt;MPOGEUSR.DAT&amp;lt;/code&amp;gt;, and 16-bit and 32-bit files should not be interchanged without a supported conversion procedure.&lt;br /&gt;
&lt;br /&gt;
== Templates and record sizes ==&lt;br /&gt;
The 16-bit packages provide clean &amp;lt;code&amp;gt;*.NEW&amp;lt;/code&amp;gt; templates corresponding to their &amp;lt;code&amp;gt;*.DAT&amp;lt;/code&amp;gt; files. The 32-bit packages use &amp;lt;code&amp;gt;*.VIR&amp;lt;/code&amp;gt; templates for the same purpose. Keep the original templates unchanged so a fresh game can be created later.&lt;br /&gt;
&lt;br /&gt;
The 16-bit Btrieve user, ship, and planet-family records are 246, 501, and 493 bytes respectively. The 32-bit versions use 256-byte user records and 512-byte ship and planet-family records. Mail has its own record format, and the team file is text rather than a Btrieve record set. These sizes matter when choosing the correct package or diagnosing a mismatched file; the individual fields belong in [[Data structures]].&lt;br /&gt;
&lt;br /&gt;
== Back up or start over ==&lt;br /&gt;
Before changing files, stop the game or BBS and make a copy of the entire game&#039;s data set. Back up the matching &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files together, including &amp;lt;code&amp;gt;TEA&amp;lt;/code&amp;gt; if present; restoring only a user or planet file can leave ships, scores, ownership, and teams inconsistent. Preserve the clean &amp;lt;code&amp;gt;.NEW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.VIR&amp;lt;/code&amp;gt; templates separately from these live-game backups. If the host provides a supported consistent-backup method, that is an alternative to stopping it; ordinary copies taken while Btrieve is writing may contain records from different points in time.&lt;br /&gt;
&lt;br /&gt;
A recoverable installation backup should also include the matching module executable, module-definition and configuration files, compiled main/help/ship-class messages, and any local text resources in use, such as menu text or frontend settings. Record the relevant BBS/module configuration and keep release notes with the backup. Database files are the critical saved game, but they may not be usable with an unrelated DLL or message-file version.&lt;br /&gt;
&lt;br /&gt;
To start a new game, with the module stopped, copy each clean template over its matching &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; file: for example, &amp;lt;code&amp;gt;MPOGEUSR.NEW&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MPOGEUSR.DAT&amp;lt;/code&amp;gt; in 16-bit ge-next, or &amp;lt;code&amp;gt;MPOGEUSR.VIR&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MPOGEUSR.DAT&amp;lt;/code&amp;gt; in ge-next32. Do this for &#039;&#039;&#039;all&#039;&#039;&#039; files used by that game, not just one database. Keep a backup of the old game until the fresh one has started successfully. This resets the game; it is not a way to repair an existing game while preserving its progress.&lt;br /&gt;
&lt;br /&gt;
== Upgrades and rollback ==&lt;br /&gt;
Before upgrading, read the intervening release notes and check for changes to database records, file prefixes, configuration options, or required migrations. Keep the old installation and a consistent backup until the new version has been verified. Use the new release&#039;s message files as the starting point and merge local configuration values deliberately; replacing messages blindly can discard local settings, while retaining old messages can omit required options or text. A clean &amp;lt;code&amp;gt;.NEW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.VIR&amp;lt;/code&amp;gt; template is for starting over, not for upgrading a live game while preserving its players and planets.&lt;br /&gt;
&lt;br /&gt;
After startup, inspect host and module logs, then test the menu, roster, a saved ship and planet, scans, and a database-changing action. Verify scheduled cleanup when practical and keep the previous backup until the new build has seen normal multi-user play. If rollback is needed, restore the executable, messages, configuration, and all related saved records from the &#039;&#039;&#039;same backup point&#039;&#039;&#039;. Replacing only the DLL while leaving records written by a newer layout is not a safe rollback.&lt;br /&gt;
&lt;br /&gt;
== MBBSEmu ==&lt;br /&gt;
MBBSEmu converts the module&#039;s Btrieve &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files to corresponding SQLite &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; files and runs the game using those SQLite copies. A &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; file may remain in the folder even when the live changes are in its &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; companion. The team &amp;lt;code&amp;gt;TEA.DAT&amp;lt;/code&amp;gt; remains a text file; it does not become a Btrieve-backed &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; game database.&lt;br /&gt;
&lt;br /&gt;
For backups under MBBSEmu, stop the emulator and copy the game&#039;s &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; files &#039;&#039;&#039;and&#039;&#039;&#039; its &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files as one set, plus the team file if used. For a full reset, stop MBBSEmu, back up the old files, remove the game&#039;s corresponding &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; copies, and copy the clean &amp;lt;code&amp;gt;.NEW&amp;lt;/code&amp;gt; templates over &#039;&#039;&#039;all&#039;&#039;&#039; of that game&#039;s &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files (including the team file). MBBSEmu will create fresh SQLite copies when it next loads the module. Merely replacing &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; while leaving an old &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; in place is not a reliable reset.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Data structures]]&lt;br /&gt;
* [[Integer and storage assumptions]]&lt;br /&gt;
* [[MBBSEmu]]&lt;br /&gt;
* [[Classic registration and security system]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Sysop documentation]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Porting_Galactic_Empire&amp;diff=2151</id>
		<title>Porting Galactic Empire</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Porting_Galactic_Empire&amp;diff=2151"/>
		<updated>2026-10-18T17:53:45Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Porting Galactic Empire&#039;&#039;&#039; means reproducing a MajorBBS game, not merely getting its C source to compile on another platform. GE depends on host callbacks, shared workspaces, [[Btrieve]] records and keys, and the order in which timed events run. A port should decide which classic behavior it is preserving and which known defects it is correcting.&lt;br /&gt;
&lt;br /&gt;
== Choose a compatibility target ==&lt;br /&gt;
There is a difference between reproducing the intentions of classic GE, reproducing every visible behavior of the 3.2e binary, and reproducing the source&#039;s accidental behavior. Those goals can conflict: widening an overflowing calculation may be the right fix for gameplay but will not reproduce a classic exploit. State the target and record intentional departures; the [[Classic bug database]] supplies concrete cases.&lt;br /&gt;
&lt;br /&gt;
When comparing versions, separate original GE behavior from ge-next&#039;s changes. Elwynor&#039;s 32-bit port is useful for checking host and architecture differences, but it is not a substitute for the 16-bit source or a running classic game. See [[Versions of Galactic Empire]].&lt;br /&gt;
&lt;br /&gt;
== Recreate the host contract ==&lt;br /&gt;
GE is entered through MajorBBS module registration. The host supplies the current channel and account, invokes input and lifecycle callbacks, runs scheduled &amp;lt;code&amp;gt;rtkick()&amp;lt;/code&amp;gt; callbacks, and provides message formatting and Btrieve services. A replacement host needs to preserve the effects of those services, not just their function names. See [[MajorBBS integration]] and [[Game execution flow]].&lt;br /&gt;
&lt;br /&gt;
Distinguish ordinary exit, carrier loss, account deletion, GE&#039;s midnight maintenance, and the BBS disconnecting users for its own cleanup. These follow different paths and can have different consequences for a ship. ge-next&#039;s use of &amp;lt;code&amp;gt;rsmodes&amp;lt;/code&amp;gt; during a cleanup-related hangup is an intentional correction to classic behavior.&lt;br /&gt;
&lt;br /&gt;
== Keep session and world state separate ==&lt;br /&gt;
The 16-bit code uses &amp;lt;code&amp;gt;usrnum&amp;lt;/code&amp;gt; to select a live BBS channel and global pointers and scratch variables for the current operation. A channel is reusable, not a permanent account or ship identifier. A concurrent port must isolate or serialize operations that touch this shared state, including scans, output, database buffers, and delayed ordnance. Merely copying the globals into a server-wide object would introduce cross-user races.&lt;br /&gt;
&lt;br /&gt;
GE has several lifetimes that must remain distinct: the connection, saved user record, current ship, created sector, and weapons already in flight. Ship destruction, leaving the module, hanging up, and deleting an account are not interchangeable cleanup operations. A projectile can outlive the connection that fired it; represent a departed owner explicitly. See [[Ship slot]], [[Scantab]], and [[Data structures]].&lt;br /&gt;
&lt;br /&gt;
== Preserve event order ==&lt;br /&gt;
Movement, automatic ship systems, projectiles, NPC decisions, and planetary updates have different schedules. Replacing them with one undifferentiated loop can change which hit receives kill credit, when a damaged ship stops acting, whether a weapon intercepts before its target moves, and when a planet is updated. Preserve cadence and meaningful ordering before changing mechanics. See [[Game timing]] and [[Game execution flow]].&lt;br /&gt;
&lt;br /&gt;
Sectors are generated on demand, with planet and wormhole records stored in Btrieve. A concurrent implementation must prevent two operations from independently creating the same sector or conflicting destination records. Test both first discovery and later reads of an existing sector. See [[Sector]] and [[Wormholes]].&lt;br /&gt;
&lt;br /&gt;
== Match storage and arithmetic deliberately ==&lt;br /&gt;
Classic GE assumes a 16-bit &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, 32-bit &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;, narrow byte fields, and fixed Btrieve key layouts. Wider native arithmetic, different packing, or different signedness can change play and saved data. Classic structures do not all have the same size as their Btrieve records, so &amp;lt;code&amp;gt;sizeof&amp;lt;/code&amp;gt; cannot be accepted uncritically. The 32-bit ports use explicit narrow types and different record lengths. See [[Integer and storage assumptions]] and [[Data structures]].&lt;br /&gt;
&lt;br /&gt;
Btrieve has behavior beyond reading and writing bytes: key ordering, duplicate and nonmodifiable keys, record-position operations, return codes, and file-selection state can all affect GE. Preserve the observable behavior of the operations GE calls. MajorBBS message formatting and output-buffer clearing are likewise part of the interface; a message delivered to the wrong channel is a portability bug even if its text is correct.&lt;br /&gt;
&lt;br /&gt;
== A practical verification sequence ==&lt;br /&gt;
# Establish a baseline with stock classic files, configuration, and more than one connected player. Record command output and timed behavior before changing the implementation.&lt;br /&gt;
# Audit persistent structures against the actual Btrieve templates and key definitions. Add size and offset checks where the target compiler permits them.&lt;br /&gt;
# Reproduce module entry, exit, hangup, cleanup, message output, and database operations before tuning combat or NPC logic.&lt;br /&gt;
# Test arithmetic boundaries: zero, negative input, maximum inventories, signed/unsigned scores, coordinate axes, galaxy edges, and numeric sentinels.&lt;br /&gt;
# Test delayed behavior: moving targets, wormholes, mines, projectiles whose owner leaves, and users reconnecting on a reused channel.&lt;br /&gt;
# Compare a confirmed defect against the [[Classic bug database]], then apply any correction separately from unrelated porting changes.&lt;br /&gt;
# Where an emulator and real MajorBBS disagree, verify host behavior before adding a game-side workaround.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[MajorBBS integration]]&lt;br /&gt;
* [[Integer and storage assumptions]]&lt;br /&gt;
* [[Data structures]]&lt;br /&gt;
* [[Game execution flow]]&lt;br /&gt;
* [[MBBSEmu]]&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Source code]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Integer_and_storage_assumptions&amp;diff=2150</id>
		<title>Integer and storage assumptions</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Integer_and_storage_assumptions&amp;diff=2150"/>
		<updated>2026-10-18T17:53:44Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classic GE was written for 16-bit x86 C and [[Btrieve]]. Its calculations, in-memory structures, database records, and output conventions do not all have the same width. These details matter when investigating a classic bug or porting the game; see [[Porting Galactic Empire]] for the wider workflow.&lt;br /&gt;
&lt;br /&gt;
== Integer and floating-point widths ==&lt;br /&gt;
In the original 16-bit environment, &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; and GE&#039;s &amp;lt;code&amp;gt;byte&amp;lt;/code&amp;gt; are one byte, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt; are two bytes, and &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unsigned long&amp;lt;/code&amp;gt; are four bytes. GE also stores positions, headings, speeds, damage, and some energy values as &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;. A field&#039;s declared type, not a modern compiler&#039;s &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; size, controls what can be saved in it.&lt;br /&gt;
&lt;br /&gt;
For example, &amp;lt;code&amp;gt;WARUSR.score&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARUSR.cash&amp;lt;/code&amp;gt; are 32-bit unsigned values in the 16-bit code, but ship and user kill counters are 16-bit &amp;lt;code&amp;gt;unsigned&amp;lt;/code&amp;gt; values. &amp;lt;code&amp;gt;WARSHP.shield&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;WARSHP.lastfired&amp;lt;/code&amp;gt; are 16-bit signed &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; values; ship inventory quantities are 32-bit &amp;lt;code&amp;gt;unsigned long&amp;lt;/code&amp;gt;. Broad statements such as “scores are 32-bit” do not describe every counter in a record.&lt;br /&gt;
&lt;br /&gt;
The 32-bit port uses MajorBBS types such as &amp;lt;code&amp;gt;SHORT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USHORT&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ULONG&amp;lt;/code&amp;gt; in persistent structures. This is necessary because a native 32-bit &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; can change intermediate arithmetic even if the destination field is narrow. ge-next32&#039;s &amp;lt;code&amp;gt;gernd()&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;USHORT&amp;lt;/code&amp;gt; to preserve 16-bit unsigned behavior at callers that depend on it. Fixed-width fields alone are not enough: promotions, casts, and the point at which a result is narrowed also matter.&lt;br /&gt;
&lt;br /&gt;
== Arithmetic and display ==&lt;br /&gt;
* Multiplication may overflow before a later division reduces the result. Widen the operands before multiplying if the larger intermediate is intended.&lt;br /&gt;
* Subtracting from an unsigned value can wrap instead of producing a negative number. Check availability before changing inventory or energy.&lt;br /&gt;
* Converting a floating-point result to an integer truncates its fractional part. Moving the conversion earlier or later changes distance, damage, or production.&lt;br /&gt;
* A stored unsigned value may be displayed or sorted as signed. Classic&#039;s roster score key is one example: storage type, Btrieve key interpretation, and printed representation must be checked separately. See [[Roster command]].&lt;br /&gt;
* MajorBBS message resources have their own formatter conventions. A C &amp;lt;code&amp;gt;printf()&amp;lt;/code&amp;gt; format is not automatically valid in an MSG file; the expected argument width must match the directive.&lt;br /&gt;
&lt;br /&gt;
These are not theoretical hazards. See [[Classic bug: Cargo weight overflow]], [[Classic bug: Cash and counter wraparound]], and [[Classic bug: Flux subtraction underflow]] for gameplay consequences.&lt;br /&gt;
&lt;br /&gt;
== Byte sentinels and slot limits ==&lt;br /&gt;
Byte-sized fields often use a value outside the valid slot range as a sentinel, but the meaning is specific to each field. For mines in ge-next, &amp;lt;code&amp;gt;MINE_UNUSED&amp;lt;/code&amp;gt; is 255 and &amp;lt;code&amp;gt;MINE_NO_USER&amp;lt;/code&amp;gt; is 254: an unused mine and a live mine without a player owner are different states. Classic did not make that distinction in the same way. A port must reserve sentinel values when sizing channel or ship tables and must not turn one field&#039;s “255” into another field&#039;s “no user.” See [[Mines]] and [[Ship slot]].&lt;br /&gt;
&lt;br /&gt;
== Btrieve record sizes and layout ==&lt;br /&gt;
The shipped classic 16-bit Btrieve templates use 246-byte user records, 501-byte ship records, and 493-byte sector/planet/wormhole records. The corresponding classic C structures are larger: 255, 514, and 512 bytes respectively. GE&#039;s Btrieve calls use the configured record length, so copying &amp;lt;code&amp;gt;sizeof(struct)&amp;lt;/code&amp;gt; bytes as though it were the on-disk format would be wrong. 16-bit ge-next made its structures match the actual 246/501/493-byte records.&lt;br /&gt;
&lt;br /&gt;
Elwynor&#039;s V10 port and ge-next32 use 256-byte user records and 512-byte ship and planet-family records, with matching structure sizes. Those are not byte-for-byte interchangeable with 16-bit files just because the field names look alike. ge-next32 uses explicit filler and compile-time size checks. The ge-arena builds place some newer fields in reserved record space rather than silently enlarging the files. [[Data structures]] gives the complete record table, key layout, and evolution of the fields.&lt;br /&gt;
&lt;br /&gt;
Btrieve keys make offsets and signedness as important as total size. Field order, padding, string width, and key interpretation must be verified against the real file definition. A size check cannot catch a field moved to the wrong offset. Do not infer disk layout solely from a compiler&#039;s default packing or a later port&#039;s structure.&lt;br /&gt;
&lt;br /&gt;
== Porting rule ==&lt;br /&gt;
First establish the valid range and intended result for each operation. Then choose whether invalid input is rejected, an internal result is clamped, or a genuine classic wrap is deliberately retained. Document that choice and test the relevant boundaries. Widening every calculation or preserving every overflow without inspection can each change the game in unintended ways.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Data structures]]&lt;br /&gt;
* [[Porting Galactic Empire]]&lt;br /&gt;
* [[Classic bug database]]&lt;br /&gt;
* [[Roster command]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Classic bugs: Numeric correctness]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Installing_Galactic_Empire&amp;diff=2149</id>
		<title>Installing Galactic Empire</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Installing_Galactic_Empire&amp;diff=2149"/>
		<updated>2026-10-18T17:53:42Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Galactic Empire&#039;&#039;&#039; is distributed as a BBS module, not a standalone game. Installation begins by choosing a build that matches both the host and the version of the game. This page covers the common steps; the linked guides provide version-specific files, registration, and emulator instructions.&lt;br /&gt;
&lt;br /&gt;
== Choose a game and host ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Game !! Suitable host and starting point&lt;br /&gt;
|-&lt;br /&gt;
| [[Classic Galactic Empire|Classic GE 3.2e]] || Original 16-bit MajorBBS/Worldgroup game. On MBBSEmu, use a compatible classic package and consult [[Running Galactic Empire with MBBSEmu#Running classic GE|the classic setup notes]]. The distributed build may require a board-specific registration setting; see [[Classic registration and security system]].&lt;br /&gt;
|-&lt;br /&gt;
| [[Elwynor Galactic Empire|Elwynor GE]] || Faithful 32-bit port of classic GE for Worldgroup 3.2 and The Major BBS V10. Use its own package and installation instructions; it is not interchangeable with the 16-bit classic module.&lt;br /&gt;
|-&lt;br /&gt;
| [[ge-next]] || Persistent GE game with separate 16-bit MajorBBS/Worldgroup and 32-bit MajorBBS V10 builds. Supported MBBSEmu versions use the &#039;&#039;&#039;16-bit&#039;&#039;&#039; package. See [[ge-next installation]].&lt;br /&gt;
|-&lt;br /&gt;
| [[ge-arena]] || Separate match-based module, available in 16-bit and 32-bit builds. It has its own file prefix, configuration, and saved game; do not install it as an update to ge-next.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Download a &#039;&#039;&#039;full release archive&#039;&#039;&#039; for the selected game and architecture. A patch archive assumes a particular installed version and may omit files needed for a new installation. Read that release&#039;s notes before copying anything, especially when replacing an existing game. Playing on someone else&#039;s BBS requires no local module installation; see [[Where to play online]].&lt;br /&gt;
&lt;br /&gt;
== Understand the files ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File type !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.DLL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.MDF&amp;lt;/code&amp;gt; || The executable module and its MajorBBS module definition. The MDF identifies the module and its message resources. See [[MajorBBS integration]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.MSG&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.MCV&amp;lt;/code&amp;gt; || Editable message/configuration sources and compiled runtime resources. Main messages, help, and ship classes normally have separate MSG files. Loading a module on a board should generate MCVs based on the MSG files; do not copy MCV files from a different installation. See [[Configuring Galactic Empire]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.DAT&amp;lt;/code&amp;gt; || Starting data in a full archive, then the live saved game after play begins. The files used vary by game; the team file is text, not a [[Btrieve]] database. See [[Database files]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.NEW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.VIR&amp;lt;/code&amp;gt; || Clean data templates supplied with 16-bit and 32-bit packages respectively. Retain them for a deliberate fresh start; they are &#039;&#039;&#039;not&#039;&#039;&#039; backups of the live game.&lt;br /&gt;
|-&lt;br /&gt;
| Other text files || Release notes, menu text, licensing, and optional frontend documentation or utilities. Keep them with the matching release.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
File prefixes identify the game: classic uses &amp;lt;code&amp;gt;MBM*&amp;lt;/code&amp;gt;, ge-next 0.3+ uses &amp;lt;code&amp;gt;MPOGEMP&amp;lt;/code&amp;gt; for its module and &amp;lt;code&amp;gt;MPOGE*&amp;lt;/code&amp;gt; for support files, and ge-arena uses &amp;lt;code&amp;gt;MPOGA*&amp;lt;/code&amp;gt;. Do not mix files just because their suffixes or purposes look alike. Nor should 16-bit and 32-bit databases or compiled messages be swapped without an explicitly supported conversion path. [[Database files]] lists the actual saved files for each game.&lt;br /&gt;
&lt;br /&gt;
== Install a new game ==&lt;br /&gt;
# Extract the complete, matching release to the location expected by the host. If installing more than one GE variant, keep each one&#039;s files and saved data separate.&lt;br /&gt;
# Register or enable the module through the BBS&#039;s module/menu setup using its MDF. Under MBBSEmu, configure the module in &amp;lt;code&amp;gt;modules.json&amp;lt;/code&amp;gt; instead; follow [[Running Galactic Empire with MBBSEmu]] for emulator-specific setup. Classic registration is a separate matter from host module registration.&lt;br /&gt;
# Review any settings that must be chosen before play. See [[Configuring Galactic Empire]].&lt;br /&gt;
# Start the host. Check its log for missing DLLs, messages, databases, or record-size errors. Enter the game as a test user, check its menu and help, create or load a ship where applicable, and verify a scan and a saved change.&lt;br /&gt;
&lt;br /&gt;
Full release archives normally include starting &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files, so startup is &#039;&#039;&#039;not&#039;&#039;&#039; a general instruction to rebuild a database from &amp;lt;code&amp;gt;.NEW&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.VIR&amp;lt;/code&amp;gt;. An arena match may generate its own sectors during play, but that is different from creating the installation&#039;s data files. To reset an existing game, stop it and follow the complete procedure in [[Database files#Back up or start over|Database files]].&lt;br /&gt;
&lt;br /&gt;
== Upgrade or roll back ==&lt;br /&gt;
ge-next can generally be upgraded across point releases only, for example ge-next 0.3 should upgrade to ge-next 0.3.3 just fine. Classic GE games cannot be upgraded to ge-next. ge-next 0.2 and lower games cannot be upgraded to ge-next 0.3.&lt;br /&gt;
&lt;br /&gt;
Before an upgrade, stop the game or take a host-supported consistent backup. Preserve the &#039;&#039;&#039;entire&#039;&#039;&#039; matching saved-data set, the DLL, MDF, MSG and MCV files, local text resources, and host configuration. Under MBBSEmu, also account for its live SQLite &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; companions; see [[Database files#MBBSEmu|MBBSEmu database handling]]. Read every intervening release note for incompatible record layouts, required resets, renamed files, or new configuration entries.&lt;br /&gt;
&lt;br /&gt;
Install the new module and use its MSG sources as the baseline, merging local settings deliberately. Do not overwrite live &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files with the starter files from a full release unless you are intentionally resetting the game. Do not bring over MCV files from the previous instance; an old MCV may refer to the wrong message identifiers or options in a new DLL. After starting the upgrade, inspect the host log and test an existing account and saved record before opening the game to everyone.&lt;br /&gt;
&lt;br /&gt;
If an upgrade must be undone, restore &#039;&#039;&#039;the DLL, resources, configuration, and all saved data from the same backup point&#039;&#039;&#039;. Replacing only the DLL is not a safe rollback after newer code has written records. The detailed procedure and reset distinctions are in [[Database files#Upgrades and rollback|Database files]].&lt;br /&gt;
&lt;br /&gt;
== Running multiple variants ==&lt;br /&gt;
Classic GE, ge-next 0.3+, and ge-arena can coexist because their current releases use different module names and file prefixes. Give each its own host registration, message resources, and saved files. Distinct filenames prevent collisions; they do not make one game&#039;s databases compatible with another&#039;s. Refer to [[ge-next installation]] for that game&#039;s exact files and to [[Database files]] for the data each variant keeps.&lt;br /&gt;
&lt;br /&gt;
== Further guides ==&lt;br /&gt;
* [[ge-next installation]] - ge-next packages and upgrade notes&lt;br /&gt;
* [[Running Galactic Empire with MBBSEmu]] - local emulator setup, including classic GE&lt;br /&gt;
* [[Classic registration and security system]] - original game&#039;s registration and common online build&lt;br /&gt;
* [[Configuring Galactic Empire]] - MSG files, configuration, and MCV compilation&lt;br /&gt;
* [[Database files]] - backups, templates, resets, and rollback&lt;br /&gt;
* [[GEINST.DOC|Original GEINST.DOC]] - historical 3.2 installation manual, not a guide to every modern build&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Sysop documentation]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Data_structures&amp;diff=2148</id>
		<title>Data structures</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Data_structures&amp;diff=2148"/>
		<updated>2026-10-18T17:53:41Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;Galactic Empire&#039;&#039; uses C structures both as live state and as the bytes passed to [[Btrieve]]. A field&#039;s type, order, and offset can therefore be part of the saved-game format. The principal definitions are in &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt;; the 16-bit ge-next and 32-bit V10 ports must be read as distinct layouts, not as structures whose bytes can be copied between platforms.&lt;br /&gt;
&lt;br /&gt;
== Persistent records ==&lt;br /&gt;
The game has separate user, ship, planet-family, and (in standard ge-next) mail databases. The functions &amp;lt;code&amp;gt;geudb()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gepdb()&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;gesdb()&amp;lt;/code&amp;gt; select the corresponding Btrieve file and key. A Btrieve file is opened with the compiled &amp;lt;code&amp;gt;sizeof&amp;lt;/code&amp;gt; its record structure, so adding a field without removing or adjusting filler is not merely a source-code change.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Record !! Database role !! Classic structure !! Classic Btrieve record !! 16-bit ge-next 0.3 structure / record !! Elwynor V10 structure / record !! ge-next32 structure / record&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WARUSR&amp;lt;/code&amp;gt; || One persistent player || 255 bytes || 246 bytes || 246 bytes || 256 bytes || 256 bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WARSHP&amp;lt;/code&amp;gt; || One persistent ship || 514 bytes || 501 bytes || 501 bytes || 512 bytes || 512 bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GALSECT&amp;lt;/code&amp;gt; || Sector index || 512 bytes || 493 bytes || 493 bytes || 512 bytes || 512 bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GALPLNT&amp;lt;/code&amp;gt; || Planet body || 512 bytes || 493 bytes || 493 bytes || 512 bytes || 512 bytes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GALWORM&amp;lt;/code&amp;gt; || Wormhole body || 512 bytes || 493 bytes || 493 bytes || 512 bytes || 512 bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The shipped classic &amp;lt;code&amp;gt;MBMGEUSR.NEW&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MBMGESHP.NEW&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;MBMGEPLT.NEW&amp;lt;/code&amp;gt; Btrieve templates declare fixed record lengths of &#039;&#039;&#039;246&#039;&#039;&#039;, &#039;&#039;&#039;501&#039;&#039;&#039;, and &#039;&#039;&#039;493&#039;&#039;&#039; bytes respectively. The corresponding classic &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files have the same lengths. These are the actual allotted &#039;&#039;logical record&#039;&#039; lengths, not the Btrieve page size or physical slot size. The planet database uses 493 bytes for each of its three record types.&lt;br /&gt;
&lt;br /&gt;
Classic&#039;s &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt; uses filler expressions written around nominal 256-byte user and 512-byte ship/planet targets. Summing its members under the byte-packed 16-bit layout instead gives the classic structure sizes shown in the table: the user structure is 255 bytes, not 256, and the ship structure is 514, not 512. These are calculated structure sizes, distinct from the fixed record lengths read from the shipped Btrieve templates. Classic opens each Btrieve file with &amp;lt;code&amp;gt;sizeof&amp;lt;/code&amp;gt; the compiled structure; the file&#039;s own fixed-length definition is a separate constraint. ge-next&#039;s 16-bit 0.3 structures use explicit filler sized to the real 246/501/493-byte records rather than perpetuating the misleading classic arithmetic.&lt;br /&gt;
&lt;br /&gt;
The shipped Elwynor V10 and ge-next32 Btrieve files confirm 256-byte user records and 512-byte ship and planet-family records, matching their respective structures; ge-next32 also checks all five structure sizes at compile time. Equal lengths do not imply compatible layouts: Elwynor&#039;s port and ge-next32 arrange or use fields differently, so their database records should not be exchanged without conversion. A 16-bit record is not a truncated 32-bit record either: member order, alignment, and some compatibility slots differ. In particular, 0.3&#039;s reordered records are not compatible with pre-0.3 saved games; the 0.3 release notes require a reset.&lt;br /&gt;
&lt;br /&gt;
=== WARUSR: player account ===&lt;br /&gt;
&amp;lt;code&amp;gt;userid&amp;lt;/code&amp;gt; is the identity key. &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; is a roster-sorting key; &amp;lt;code&amp;gt;teamcode&amp;lt;/code&amp;gt; is another indexed key. Standard ge-next also stores cash, ship counts and highest assigned ship number, total and player-only kills, planet count, separate kill/planet score components, population, 30 option bytes, and eight faction-relation bytes. Its &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; is the cumulative game score, while the kill and planet components describe where it came from. See [[Scoring and rosters]] and [[Droids#Factions and distress in ge-next|factions]].&lt;br /&gt;
&lt;br /&gt;
Classic reserved a 40-byte &amp;lt;code&amp;gt;waste&amp;lt;/code&amp;gt; area and retained a &amp;lt;code&amp;gt;debt&amp;lt;/code&amp;gt; field from an apparent earlier or unfinished credit system. The [[GEREADME.DOC#05/09/89_Release_2.0d|2.0d release notes]] say the debt line was removed from REPORT ACCOUNT, and 3.2e still includes an unused message about a bank limiting cash advances because of outstanding debt. The field is initialized to zero, but the surviving 3.2e code does not appear to incur or repay player debt. Not every odd-looking field was dead: &amp;lt;code&amp;gt;rospos&amp;lt;/code&amp;gt; was assigned during roster processing, displayed in reports, and used in kill-bonus calculation. ge-next eventually removed the unused space and the obsolete stored roster-position field, replacing its behavior with a roster lookup. A block of &amp;lt;code&amp;gt;key_filler&amp;lt;/code&amp;gt; in the 16-bit 0.3 structure deliberately keeps &amp;lt;code&amp;gt;teamcode&amp;lt;/code&amp;gt; at its required Btrieve key offset. A developer must not remove that block merely because it has no gameplay value.&lt;br /&gt;
&lt;br /&gt;
In ge-arena, the same persistent user-record family retains account settings and stores an &amp;lt;code&amp;gt;arena_wins[]&amp;lt;/code&amp;gt; count for each mode. Its &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; is repurposed as total arena wins for roster sorting; per-match kills, deaths, time, bases, and mode score live in &amp;lt;code&amp;gt;ARENAPLAYER&amp;lt;/code&amp;gt;, not in permanent ship records. The win array takes bytes from reserved filler so that the arena variant keeps the same record length within its architecture. Arena and standard-game databases are separate and should not be interchanged.&lt;br /&gt;
&lt;br /&gt;
=== WARSHP: ship state ===&lt;br /&gt;
A ship record begins with its owner ID and &amp;lt;code&amp;gt;shipno&amp;lt;/code&amp;gt;, followed by name, class, status, coordinates, heading and target heading, speed and target speed, damage, flux energy, phaser and shield state, cloak state, and live control damage. It also holds the current lock, last attacker, ship kill counts, inventory, repair and combat timers, deployed decoy references, and incoming torpedo/missile tracking. The &amp;lt;code&amp;gt;ltorps[]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;lmissl[]&amp;lt;/code&amp;gt; arrays are ordnance pursuing &#039;&#039;this&#039;&#039; ship, not a list of everything this ship has fired. Later fields include upgrade bits, jamming, weapon throttles, overspeed accumulation, and state used by Cybertrons and other NPCs. Some fields are explicitly user-only or NPC-only even though they share the same record format.&lt;br /&gt;
&lt;br /&gt;
The live ship slot or MajorBBS channel is not the same thing as persistent &amp;lt;code&amp;gt;shipno&amp;lt;/code&amp;gt;. A slot can be reused; it must not be treated as a stable player identity in delayed combat state. See [[Ship slot]] and [[Ship number]]. Standard ge-next stores player and NPC ship records in the ship database; ge-arena uses disposable match ships, while its persistent user records remain. ge-arena&#039;s &amp;lt;code&amp;gt;damage_notice&amp;lt;/code&amp;gt; byte for Cyber-Base warning thresholds consumes one byte of the 16-bit ship filler rather than increasing &amp;lt;code&amp;gt;WARSHP&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Classic carried fields associated with abandoned or partial ideas, including &amp;lt;code&amp;gt;train&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;emulate&amp;lt;/code&amp;gt; flag in the original header. The 0.2.6 line still retained the old field ordering, a 35-character ship-name array, and several fields added into legacy spare space. Before RC2, the ship-name array was brought into line with its actual usable length. In 0.3 RC2, &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;coord&amp;lt;/code&amp;gt;, movement values, combat state, equipment, and NPC state were regrouped, and unused/redundant members were removed. The new field order makes the record easier to audit but changes offsets, which is why old databases cannot be opened as though they were 0.3 records.&lt;br /&gt;
&lt;br /&gt;
=== Sector, planet, and wormhole ===&lt;br /&gt;
&amp;lt;code&amp;gt;GALSECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GALPLNT&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;GALWORM&amp;lt;/code&amp;gt; are different records in the &#039;&#039;same&#039;&#039; planet database. Each begins with &amp;lt;code&amp;gt;xsect&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ysect&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plnum&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, allowing a shared sector/number key. The sector index has &amp;lt;code&amp;gt;plnum == 0&amp;lt;/code&amp;gt; and contains &amp;lt;code&amp;gt;numplan&amp;lt;/code&amp;gt; plus up to nine &amp;lt;code&amp;gt;PLNTCOORD&amp;lt;/code&amp;gt; entries identifying the type and position of each body. Planets and wormholes use numbered body records; their filler makes every record in this Btrieve file the same length. &amp;lt;code&amp;gt;PKEY&amp;lt;/code&amp;gt; is the small lookup key used to address these records, not another stored body format. See [[Sector]] and [[Wormholes]].&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;GALPLNT&amp;lt;/code&amp;gt; record holds its coordinates, owner, name, environment and resource ratings, cash and tax, tax rate, trade password, fourteen &amp;lt;code&amp;gt;ITEM&amp;lt;/code&amp;gt; entries, beacon, spy owner, team code, and update bookkeeping. Each &amp;lt;code&amp;gt;ITEM&amp;lt;/code&amp;gt; has quantity, production rate, allied-sales flag, reserve, allied markup, and amount sold to allies. An unowned planet still has a full planet record; ownership does not determine whether the record exists. Standard ge-next uses &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;plantimesave&amp;lt;/code&amp;gt; to schedule and resume production, and stores the nebula seed in Zygor&#039;s &amp;lt;code&amp;gt;nebseed&amp;lt;/code&amp;gt; field. ge-arena leaves its nebula seed in memory; its planet filler instead contains shield/phaser boosts and flags for upgrades or maintenance, alongside the normal item fields. See [[Planetary production]], [[Zygor]], and [[Nebulas]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;GALWORM&amp;lt;/code&amp;gt; stores entrance coordinates, a destination coordinate, visibility flag, and optional name. It has no planet economy or owner. Both planet and wormhole records share the sector key prefix and fixed-size database slot, but their remaining bytes mean different things. Blindly interpreting a wormhole as &amp;lt;code&amp;gt;GALPLNT&amp;lt;/code&amp;gt; would turn destination and padding bytes into bogus planet fields.&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
Standard 16-bit ge-next opens its mail database using &amp;lt;code&amp;gt;sizeof(MESSAGE) + GEMSGSIZ&amp;lt;/code&amp;gt;, documented as a 1000-byte packed record. &amp;lt;code&amp;gt;MESSAGE&amp;lt;/code&amp;gt; is a MajorBBS-style message header and text envelope; &amp;lt;code&amp;gt;MAIL&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;MAILSTAT&amp;lt;/code&amp;gt; are GE&#039;s &#039;&#039;payload formats&#039;&#039; placed inside that text, not independent 1000-byte Btrieve records. A normal delayed report can carry a template ID, class, recipient, names, coordinates, and numeric parameters; a production-status report uses &amp;lt;code&amp;gt;MAILSTAT&amp;lt;/code&amp;gt; to carry a planet snapshot. The 32-bit port wraps the V10 message header and a fixed GE text payload in &amp;lt;code&amp;gt;GEMESSAGE&amp;lt;/code&amp;gt;, and opens the database using &amp;lt;code&amp;gt;sizeof(GEMESSAGE)&amp;lt;/code&amp;gt;. ge-arena does not use the mail database. See [[Classic bug: Rejected mail leaks into output]].&lt;br /&gt;
&lt;br /&gt;
The published classic GE source includes &amp;lt;code&amp;gt;message.h&amp;lt;/code&amp;gt; but does not provide the file. GE&#039;s private mail database uses a message structure modeled on the MajorBBS mail header; classic could also route reports to a player&#039;s MajorBBS mailbox. The classic release notes describe GE mail as the older path and say that a later release made the personal mailbox the default while retaining GE mail through &amp;lt;code&amp;gt;USEGEMSG&amp;lt;/code&amp;gt;. The distributed 3.2e &amp;lt;code&amp;gt;MBMGEMSG.MSG&amp;lt;/code&amp;gt;, however, sets &amp;lt;code&amp;gt;USEGEMSG&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;YES&amp;lt;/code&amp;gt;, selecting GE mail. The notes do not establish why the GE database adopted this structure or when the two delivery paths first appeared. Early ge-next reconstructed &amp;lt;code&amp;gt;MESSAGE.H&amp;lt;/code&amp;gt; from MajorBBS &amp;lt;code&amp;gt;GME.H&amp;lt;/code&amp;gt; to restore the missing definition. It subsequently removed the MajorBBS-mail delivery option and kept GE mail, then folded the reconstructed &amp;lt;code&amp;gt;MESSAGE&amp;lt;/code&amp;gt; definition directly into &amp;lt;code&amp;gt;GEMAIN.H&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
&amp;lt;code&amp;gt;TEAM&amp;lt;/code&amp;gt; is a fixed-width team entry containing the code, name, member count, deletion date, password, and secret. Standard ge-next loads and saves its team table to &amp;lt;code&amp;gt;MPOGETEA.DAT&amp;lt;/code&amp;gt; as a separate text-backed table, not as a Btrieve planet/user/ship record. ge-arena does not use that file; any future arena teams are intended to be match-local. User and planet &amp;lt;code&amp;gt;teamcode&amp;lt;/code&amp;gt; fields still exist in their record layouts. See [[Teams]].&lt;br /&gt;
&lt;br /&gt;
== Live tables and workspaces ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Lifetime and purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;COORD&amp;lt;/code&amp;gt; || Two floating-point world coordinates. &amp;lt;code&amp;gt;coord1()&amp;lt;/code&amp;gt; derives a sector; &amp;lt;code&amp;gt;coord2()&amp;lt;/code&amp;gt; derives the within-sector position.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PLANETAB&amp;lt;/code&amp;gt; || One ship/channel&#039;s cached nearby planets and wormholes. It is refreshed as sectors change; stale or cross-user cache use can produce incorrect gravity/orbit behavior. See [[Classic bug: Cross-user planet cache corruption]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SCANTAB&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;SHIPTAB&amp;lt;/code&amp;gt; || Per-user scan contacts, assigned letters, distances, and headings. This is a bounded display/index table, not a persistent roster of all ships. See [[Scantab]].&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINE&amp;lt;/code&amp;gt; || Global active-mine slot: owner marker, timer, and location. Ownerless and unused are distinct markers in ge-next.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TORPEDO&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;MISSILE&amp;lt;/code&amp;gt; || Compact incoming-projectile entries in &amp;lt;code&amp;gt;WARSHP&amp;lt;/code&amp;gt;, including the firing ship slot, distance to impact, and for missiles remaining energy.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHIP&amp;lt;/code&amp;gt; || Loaded ship-class settings and NPC function hooks; configured from the ship-class MSG file, not a user ship record. ge-arena adds per-mode class and starting-loadout fields to this in-memory configuration.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S00&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;WORMTAB&amp;lt;/code&amp;gt; || Predefined neutral-zone body descriptions and temporary wormhole-pair construction data.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ENTRYTAB&amp;lt;/code&amp;gt; || Per-channel throttling/timing state for ship-entry announcements.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ARENAPLAYER&amp;lt;/code&amp;gt; || ge-arena-only live player state: lobby readiness, match state, selected ship, respawn delay, kills/deaths, and mode score. It is reset independently of persistent arena wins.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The game also uses globals such as &amp;lt;code&amp;gt;warsptr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;waruptr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plptr&amp;lt;/code&amp;gt;, and temporary record buffers as shared workspaces. These are intentional in the synchronous MajorBBS execution model; they are not independent copies for concurrent requests. A port that introduces concurrent handlers must isolate or serialize access to them.&lt;br /&gt;
&lt;br /&gt;
== How the layout evolved ==&lt;br /&gt;
* &#039;&#039;&#039;Classic 3.2e:&#039;&#039;&#039; The large records contained reserved filler and some fields with little or abandoned gameplay use, such as &amp;lt;code&amp;gt;WARUSR.waste&amp;lt;/code&amp;gt;, user/planet debt, and &amp;lt;code&amp;gt;GALPLNT.technology&amp;lt;/code&amp;gt;. Others that look obscure, such as &amp;lt;code&amp;gt;rospos&amp;lt;/code&amp;gt;, were active. Classic packed multiple planetary body types into a shared fixed-length database, and relied on compile-time structure sizes and key offsets.&lt;br /&gt;
* &#039;&#039;&#039;ge-next 0.1:&#039;&#039;&#039; The first compiled ge-next release fixed cash/tax overflow behavior and several planetary and ship calculations while remaining broadly close to classic&#039;s storage scheme. These fixes should not be confused with 0.3&#039;s later wholesale layout change.&lt;br /&gt;
* &#039;&#039;&#039;ge-next 0.2 and 0.2.6:&#039;&#039;&#039; The NPC and planet-update overhaul added faction relation bytes to &amp;lt;code&amp;gt;WARUSR&amp;lt;/code&amp;gt;, repurposed ship state for new NPC behavior, and replaced the planet&#039;s unused debt field with update timing. Subsequent pre-0.3 work added separate user-kill counts, a nebula seed, lock and entry state, and upgrade/overspeed fields, largely by using space in the legacy-shaped records. The 0.2.6 header still shows classic-style ordering and reserved areas.&lt;br /&gt;
* &#039;&#039;&#039;ge-next 0.3 RC2 onward:&#039;&#039;&#039; The broad restructuring removed obsolete fields, grouped related data, normalized types and names, assigned explicit offsets in comments, and recalculated filler. A separate 0.3 fix corrected &amp;lt;code&amp;gt;GALPLNT&amp;lt;/code&amp;gt;&#039;s filler after its actual item-array size was verified. Compatibility with earlier saved games was deliberately broken; resetting the databases was required. Later arena builds consume reserved bytes for arena wins, powerups, and NPC notices without changing each build&#039;s fixed record length.&lt;br /&gt;
&lt;br /&gt;
The source comments documenting offsets are an audit aid, not a substitute for checking &amp;lt;code&amp;gt;sizeof&amp;lt;/code&amp;gt; and actual Btrieve key definitions. The V10 port uses fixed-width &amp;lt;code&amp;gt;SHORT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;USHORT&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ULONG&amp;lt;/code&amp;gt; fields where appropriate and compile-time size assertions for the major records. Copying a 16-bit &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; file to the 32-bit port is not a record conversion; it requires a deliberate field-by-field migration, including key layout, signedness, and reserved bytes.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
* [[Classic bug database]]&lt;br /&gt;
* [[Porting Galactic Empire]]&lt;br /&gt;
* [[Integer and storage assumptions]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Source code]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_Galactic_Empire&amp;diff=2147</id>
		<title>Classic Galactic Empire</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_Galactic_Empire&amp;diff=2147"/>
		<updated>2026-10-18T17:53:39Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link Btrieve explanation at first mention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Classic Galactic Empire&#039;&#039;&#039; is this wiki&#039;s name for the original M.B. Murdock &amp;amp; Associates game, particularly releases 3.2d and 3.2e and the published classic source. It is the baseline used when documenting original gameplay, implementation assumptions, and inherited defects; &#039;&#039;classic&#039;&#039; was not a separate product title used by its publisher.&lt;br /&gt;
&lt;br /&gt;
== Earlier lineage ==&lt;br /&gt;
Michael B. Murdock developed the game for MajorBBS through M.B. Murdock &amp;amp; Associates. Elwynor Technologies&#039; retrospective account names &#039;&#039;Galactic War&#039;&#039; and &#039;&#039;Galactic Raiders&#039;&#039; as earlier forms of the game. &#039;&#039;Galactic Raiders&#039;&#039; briefly remained a separate module without Cybertrons. The original 2.0a release notes refer to an earlier version 1.4, so the dated changelog&#039;s April 1989 starting point is not the game&#039;s beginning.&lt;br /&gt;
&lt;br /&gt;
== Final classic releases ==&lt;br /&gt;
Version 3.0, introduced in 1992, established the on-demand Virtual Galaxy and many features recognizable in the final game. Release 3.2c (December 1993 with patches through February 1994) changed stock balance, scoring, and databases. Release [[GEREADME.DOC#03/06/94_Release_3.2d|3.2d]] (March 6, 1994) added configurable prices and revised weapons, navigation, and message filtering. Release [[GEREADME.DOC#08/06/94_Release_3.2e|3.2e]] (August 6, 1994) added configurable per-class Cybertron messages and corrected high-warp display. It is the final release recorded in the original notes. When this wiki refers to features or behavior of classic Galactic Empire, it is referring to version 3.2e unless otherwise stated.&lt;br /&gt;
&lt;br /&gt;
The published notes identify intended behavior, but not every announced fix is complete in the surviving code. See [[Original release history]] for a fuller chronology and the [[Classic bug database]] for verified discrepancies.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Classic GE is highly configurable. Stock behavior can be changed through the main message/configuration file and ship-class table. Consequently:&lt;br /&gt;
* ship prices and capabilities are not guaranteed to match between systems;&lt;br /&gt;
* galaxy size and boundary behavior may differ;&lt;br /&gt;
* NPC classes and population can be customized;&lt;br /&gt;
* item values, weights, production, and scoring can vary;&lt;br /&gt;
* user-visible text is not reliable evidence of the underlying release.&lt;br /&gt;
&lt;br /&gt;
See [[Configuring Galactic Empire]] and [[Classic NPC ship classes]].&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
Classic is a single-threaded MajorBBS module written for a 16-bit C environment. It combines fixed in-memory tables and per-channel state with persistent [[Btrieve]] records. Those assumptions matter to emulation and porting. See [[Source code]], [[Data structures]], and [[Integer and storage assumptions]].&lt;br /&gt;
&lt;br /&gt;
== Known defects ==&lt;br /&gt;
The published source includes defects ranging from display errors to numeric overflow, stale ownership, and cross-user memory corruption. They are cataloged individually in the [[Classic bug database]] so ports can decide which behavior to preserve and which defects to correct.&lt;br /&gt;
&lt;br /&gt;
== Reference areas ==&lt;br /&gt;
* [[History of Galactic Empire]]&lt;br /&gt;
* [[Original release history]]&lt;br /&gt;
* [[Official classic documentation]]&lt;br /&gt;
* [[Source code]]&lt;br /&gt;
* [[Classic bug database]]&lt;br /&gt;
* [[Configuring Galactic Empire]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Original release history]]&lt;br /&gt;
* [[Versions of Galactic Empire]]&lt;br /&gt;
* [[Classic bug database]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Versions]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Glossary&amp;diff=2145</id>
		<title>Glossary</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Glossary&amp;diff=2145"/>
		<updated>2026-10-18T17:53:26Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add Btrieve to the glossary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This glossary defines common player terms and implementation terms used throughout the &#039;&#039;Galactic Empire&#039;&#039; wiki. A linked term leads to a fuller explanation; features specific to ge-next or ge-arena are identified where that distinction matters. GE often uses one word in ordinary messages and a different name for the underlying field or routine.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Term !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| [[Rotation and headings|Absolute heading]]|| Direction measured clockwise from galactic north, independent of the ship&#039;s current orientation.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Acceleration boosters|Acceleration boosters]]|| ge-next ship upgrade that doubles a ship&#039;s acceleration without raising its rated cruising speed.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Armor plating|Armor plating]]|| ge-next ship upgrade that reduces applicable incoming damage after class durability is applied.&lt;br /&gt;
|-&lt;br /&gt;
| [[Bearing]]|| Signed direction to an object relative to the observer&#039;s heading: positive to starboard, negative to port.&lt;br /&gt;
|-&lt;br /&gt;
| [[Btrieve]]|| Indexed record storage used for GE&#039;s persistent players, ships, planets, and mail; its keys also determine lookup and roster order.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship inventory#Cargo capacity|Cargo weight]]|| Total weight of a ship&#039;s carried items, used when checking available cargo capacity.&lt;br /&gt;
|-&lt;br /&gt;
| [[Cash]]|| A player&#039;s spendable currency; distinct from a planet&#039;s operating cash and tax bank.&lt;br /&gt;
|-&lt;br /&gt;
| [[Centock]]|| Traditional approximate short game interval; up to six seconds.&lt;br /&gt;
|-&lt;br /&gt;
| [[Cloaking]]|| Ship concealment system that affects detection and some combat interactions.&lt;br /&gt;
|-&lt;br /&gt;
| [[Combat#Damage and the combat timer|Combat timer]]|| Hostility delay that temporarily prevents an ordinary exit and can affect maintenance; tracked by &amp;lt;code&amp;gt;cantexit&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| [[Cybertrons|Cyber-Base]]|| Powerful stationary Cybertron class; an NPC ship rather than an owned planet.&lt;br /&gt;
|-&lt;br /&gt;
| [[Cybertrons|Cybertron]]|| Automated hostile ship type with its own classes and behavior.&lt;br /&gt;
|-&lt;br /&gt;
| [[Maintenance#Passive damage control|Damage control]]|| Ship capability affecting repair information and recovery from system damage.&lt;br /&gt;
|-&lt;br /&gt;
| [[DAMF]]|| Ship-class damage factor used in several damage calculations.&lt;br /&gt;
|-&lt;br /&gt;
| [[Decoys|Decoy]]|| Deployable countermeasure intended to distract or absorb incoming guided weapons.&lt;br /&gt;
|-&lt;br /&gt;
| [[Droids|Droid]]|| Automated ship category other than Cybertrons. (&amp;quot;Droid&amp;quot; is the term used in the source code, not displayed to a player.)&lt;br /&gt;
|-&lt;br /&gt;
| [[Enforcer Planet]]|| Galactic Command planet responsible for neutral-zone warnings and punishment.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Enhanced damage control|Enhanced damage control]]|| ge-next ship upgrade that increases passive repair speed and adds repair-time estimates to reports.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Enhanced lock|Enhanced lock]]|| ge-next ship upgrade that reports selected actions of a ship held under an active scanner lock.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Enhanced scanners|Enhanced scanners]]|| ge-next ship upgrade that adds additional information to eligible scans.&lt;br /&gt;
|-&lt;br /&gt;
| [[Droids#Factions and distress in ge-next|Faction]]|| Ship-class allegiance used in automated-ship hostility and friendly-fire rules (ge-next only).&lt;br /&gt;
|-&lt;br /&gt;
| [[Attacking planets#Fighter assault|Fighter]]|| Planetary defense item that can also be used in fighter attacks by eligible ships.&lt;br /&gt;
|-&lt;br /&gt;
| [[Combat#Kill credit, scoring, and salvage|Flotsam]]|| Cargo recovered after a ship is destroyed; not everything aboard the wreck can be collected.&lt;br /&gt;
|-&lt;br /&gt;
| [[Flux]]|| Energy in a ship&#039;s active neutron flux pile, consumed by propulsion and ship systems.&lt;br /&gt;
|-&lt;br /&gt;
| [[Flux pod]]|| Carried item that can replenish the active flux pile.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary production|Food]]|| Planetary supply consumed by troops (and men in ge-next).&lt;br /&gt;
|-&lt;br /&gt;
| [[Rotation and headings|Galactic heading]]|| Absolute compass direction: 0 north, 90 east, 180 south, 270 west.&lt;br /&gt;
|-&lt;br /&gt;
| [[Galactic perimeter]]|| Outer boundary that wraps a ship or repels and damages it, according to &amp;lt;code&amp;gt;UNIVWRAP&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| [[Gold]]|| Cargo commodity used in trade and planetary economy; the objective in ge-arena Hoard.&lt;br /&gt;
|-&lt;br /&gt;
| [[Bearing#A scanned ship&#039;s heading|Heading]]|| In a ship scan, the target&#039;s orientation relative to the line back toward the observer: about 0 means facing the observer; about 180 means facing away. Not an absolute galactic heading.&lt;br /&gt;
|-&lt;br /&gt;
| [[Hyper-phasers|Hyper-phaser]]|| Ship phaser used while traveling in hyperspace that only hits other ships in hyperspace.&lt;br /&gt;
|-&lt;br /&gt;
| [[Impulse travel|Impulse]]|| Travel below warp 1.00, including the displayed 0.00–0.99 speed range.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ion cannons|Ion cannon]]|| Planetary defensive weapon installed and fired from a planet.&lt;br /&gt;
|-&lt;br /&gt;
| [[Jamming|Jammer]]|| Carried electronic-warfare item that interferes with enemy scans and targeting.&lt;br /&gt;
|-&lt;br /&gt;
| [[Jettison command|Jettison]]|| Discard carried items from a ship, usually to free cargo space; the discarded goods are not transferred to a planet.&lt;br /&gt;
|-&lt;br /&gt;
| [[Kill credit#When credit is decided|Lastfired]]|| Ship state recording the most recent qualifying attacker for possible kill credit; it does not necessarily identify the hit that first caused fatal damage.&lt;br /&gt;
|-&lt;br /&gt;
| [[Locks|Lock]]|| Tracked live target used by scans and guided weapons.&lt;br /&gt;
|-&lt;br /&gt;
| [[Maintenance]]|| Repair service and process for a ship in stationary orbit, subject to combat restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary production|Men]]|| Colonist population that can reproduce, produce goods, and contribute to taxes and scoring.&lt;br /&gt;
|-&lt;br /&gt;
| [[Mines|Mine]]|| Deployed explosive that remains at a location until its timer expires or it detonates.&lt;br /&gt;
|-&lt;br /&gt;
| [[Missiles|Missile]]|| Guided projectile weapon used in hyperspace.&lt;br /&gt;
|-&lt;br /&gt;
| [[Nebulas|Nebula]]|| A sector type that reduces visibility; added in ge-next.&lt;br /&gt;
|-&lt;br /&gt;
| [[Neutral zone]]|| Sector &amp;lt;code&amp;gt;0 0&amp;lt;/code&amp;gt;, normally subject to Enforcer Planet weapon restrictions.&lt;br /&gt;
|-&lt;br /&gt;
| [[Orbit]]|| Stationary position around a planet required for several planetary interactions.&lt;br /&gt;
|-&lt;br /&gt;
| [[Warp travel#Overspeed|Overspeed]]|| Travel above a ship class&#039;s rated cruising warp, with risks and penalties that differ between classic and ge-next.&lt;br /&gt;
|-&lt;br /&gt;
| [[Distance unit|Parsec]]|| Classic GE&#039;s displayed distance unit.&lt;br /&gt;
|-&lt;br /&gt;
| [[Phasers|Phaser]]|| Rechargeable directed-energy ship weapon.&lt;br /&gt;
|-&lt;br /&gt;
| [[Phasers#Firing arc and spread|Phaser spread]]|| Width of a standard phaser&#039;s firing arc; spreading the beam farther weakens a hit.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary production#Cash spent and funded bonus|Planetary bank]]|| Cash held by a planet for its own production and trade, separate from the owner&#039;s personal cash and the tax bank.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planetary update cycle|Production pass]]|| One scheduled application of &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; to a planet; ge-next can replay missed passes after downtime.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Reinforced neutron core|Reinforced neutron core]]|| ge-next ship upgrade that reduces the warp engine damage accumulated during overspeed travel.&lt;br /&gt;
|-&lt;br /&gt;
| [[Report command|Report]]|| Command family that displays a ship&#039;s navigation, systems, cargo, and other status information.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ge-arena#Playing and resupplying|Respawn]]|| Return to play with a new match-local ship after destruction in ge-arena; not part of persistent classic GE or ge-next.&lt;br /&gt;
|-&lt;br /&gt;
| [[Roster command|Roster]]|| Player ranking display: based on accumulated score in persistent GE, and on recorded match wins in ge-arena.&lt;br /&gt;
|-&lt;br /&gt;
| [[Scan command|Scan]]|| Command family used to discover objects and inspect ships, sectors, planets, and ranges.&lt;br /&gt;
|-&lt;br /&gt;
| [[Scantab#How letters are used|Scan letter]]|| Temporary letter identifying a visible ship on a player&#039;s scanner display; not the ship&#039;s permanent number or active slot.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Scan range boost|Scan range boost]]|| ge-next ship upgrade that doubles a ship&#039;s effective scanner range without bypassing concealment rules.&lt;br /&gt;
|-&lt;br /&gt;
| [[Scan command#Scanner range and the scantab|Scanner range]]|| Effective detection reach of a ship&#039;s scanners; distinct from the scale chosen for a particular scan display.&lt;br /&gt;
|-&lt;br /&gt;
| [[Scantab]]|| Each player&#039;s temporary mapping from scan letters to current ship slots.&lt;br /&gt;
|-&lt;br /&gt;
| [[Scoring and rosters|Score]]|| Persistent points accumulated through combat, planets, and other configured scoring events.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sector]]|| 10,000-by-10,000-[[Distance unit|distance-unit]] square identified by signed galactic X/Y coordinates.&lt;br /&gt;
|-&lt;br /&gt;
| [[Self-destruct]]|| Deliberate destruction of one&#039;s own ship after a countdown, producing a blast that can damage nearby ships.&lt;br /&gt;
|-&lt;br /&gt;
| [[Shields|Shield]]|| Defensive ship system that absorbs or reduces suitable incoming hits.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship class configuration|Ship class]]|| Configured ship type defining limits, movement, systems, and other class properties.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship number]]|| Owner-scoped identifier of a persistent ship record; not its active slot or list position.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship slot]]|| Reusable in-memory position holding one active player or automated ship.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades|Ship upgrade]]|| Optional improvement installed on an individual ship in ge-next; classic GE has no upgrade system.&lt;br /&gt;
|-&lt;br /&gt;
| [[Spies]]|| Agents carried by ships and deployed to gather planetary intelligence; spies stocked on a planet provide counterespionage.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ge-arena#Staging and ship selection|Staging]]|| ge-arena&#039;s pre-match minute for choosing a ship and preparing in sector 0 0 before combat begins.&lt;br /&gt;
|-&lt;br /&gt;
| [[Distance unit|Subsector]]|| ge-next&#039;s displayed distance unit.&lt;br /&gt;
|-&lt;br /&gt;
| [[Tahanian Station]]|| Galactic Command station in sector 0 0 for colonists, troops, and food; ge-arena lobby setting.&lt;br /&gt;
|-&lt;br /&gt;
| [[Taxes|Tax]]|| Revenue collected from an owned planet&#039;s population into a separate tax balance.&lt;br /&gt;
|-&lt;br /&gt;
| [[Taxes#Revenue and collection|Tax bank]]|| Taxes accumulated on an owned planet for later collection by its owner, separate from its operating cash.&lt;br /&gt;
|-&lt;br /&gt;
| [[Teams|Team]]|| Player association with shared team state and communication in persistent GE play.&lt;br /&gt;
|-&lt;br /&gt;
| [[Torpedoes|Torpedo]]|| Guided projectile weapon used at impulse speeds.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship upgrades#Transponder control|Transponder control]]|| ge-next ship upgrade that adjusts how many Cybertrons may pursue the ship at once.&lt;br /&gt;
|-&lt;br /&gt;
| [[Attacking planets#Troop assault|Troops]]|| Soldiers defending a planet against invasion and revolt; also carried for troop attacks.&lt;br /&gt;
|-&lt;br /&gt;
| [[Data structures|User record]]|| Persistent player data, including settings, cash, score, and ownership counters.&lt;br /&gt;
|-&lt;br /&gt;
| [[Warp travel|Warp]]|| Hyperspace travel at displayed speed 1.00 or higher.&lt;br /&gt;
|-&lt;br /&gt;
| [[Planet administration#3. Set work assignments and trade policy|Work allocation]]|| Percentage of a planet&#039;s workforce assigned to each production category.&lt;br /&gt;
|-&lt;br /&gt;
| [[Wormholes|Wormhole]]|| Paired feature that moves a ship between distant sectors.&lt;br /&gt;
|-&lt;br /&gt;
| [[Zippers|Zipper]]|| Carried device that triggers nearby mines to detonate on the next mine update; it does not move the ship.&lt;br /&gt;
|-&lt;br /&gt;
| [[Zygor]]|| Galactic Command&#039;s principal planet in sector &amp;lt;code&amp;gt;0 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See [[Coordinate system]] for sector coordinates and bearings, [[Game timing]] for the different meanings of a &amp;quot;tick,&amp;quot; and [[Data structures]] for the records behind several implementation terms.&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Btrieve&amp;diff=2144</id>
		<title>Btrieve</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Btrieve&amp;diff=2144"/>
		<updated>2026-10-18T17:53:22Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Add concise Btrieve reference for GE records and keys&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Btrieve&#039;&#039;&#039; is the indexed record-storage system used by &#039;&#039;Galactic Empire&#039;&#039; and MajorBBS. GE saves players, ships, planets, and mail as records in separate files. Unlike a table queried with SQL, a Btrieve file is accessed through operations such as finding a record by a &#039;&#039;&#039;key&#039;&#039;&#039; or stepping to the next or previous record in key order.&lt;br /&gt;
&lt;br /&gt;
The same file can have several keys. For example, GE can find a player by user ID, while the user database&#039;s score key lets [[Roster command|&amp;lt;code&amp;gt;ROSTER&amp;lt;/code&amp;gt;]] walk players in score order. The game does not need to load every player and sort the list itself. When a stored score changes, the database updates that key&#039;s ordering. This is why a key&#039;s field offset and signedness matter: they affect lookup and order, not just how bytes are saved. See [[Scoring and rosters]] and [[Data structures]] for GE&#039;s specific records and keys.&lt;br /&gt;
&lt;br /&gt;
GE&#039;s &amp;lt;code&amp;gt;.DAT&amp;lt;/code&amp;gt; files are therefore not plain text, and the separate team file is an exception: it is a text table, not Btrieve. On 32-bit systems, the Btrieve call interface is known as &amp;lt;code&amp;gt;WBTRV32&amp;lt;/code&amp;gt;. [[MBBSEmu]] uses the [https://github.com/mbbsemu/wbtrv32 open-source WBTRV32 replacement], which preserves the Btrieve-style calls while storing the live data in SQLite &amp;lt;code&amp;gt;.db&amp;lt;/code&amp;gt; files. See [[Database files]] for filenames, backups, and resets.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Database files]]&lt;br /&gt;
* [[Data structures]]&lt;br /&gt;
* [[Roster command]]&lt;br /&gt;
* [[MBBSEmu]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Sysop documentation]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Data_command&amp;diff=2140</id>
		<title>Data command</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Data_command&amp;diff=2140"/>
		<updated>2026-10-18T04:35:31Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Restore original FRONTEND.TXT placement after interrupted edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;DATA&#039;&#039;&#039; command has two substantially different implementations. In classic &#039;&#039;Galactic Empire&#039;&#039;, it is a documented interface for terminal programs, used by frontends such as [[GECP]], but it also exposes a considerable amount of raw internal state and relies on a hardcoded access word. In ge-next, it is a configurable, session-enabled frontend protocol whose output is designed to follow the same information restrictions as ordinary play.&lt;br /&gt;
&lt;br /&gt;
== Classic implementation ==&lt;br /&gt;
&lt;br /&gt;
The classic command is not listed in normal in-game help. [[GETERM.DOC]] documents &amp;lt;code&amp;gt;DATA SCAN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DATA REPORT&amp;lt;/code&amp;gt; for terminal-program authors, and [[GEINST.DOC]] also describes them as commands intended for graphical or other alternative displays. Classic 3.2e additionally implements &amp;lt;code&amp;gt;DATA SECTOR&amp;lt;/code&amp;gt;, which is not covered by &amp;lt;code&amp;gt;GETERM.DOC&amp;lt;/code&amp;gt;. Its syntax is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
DATA qazwsx REPORT&lt;br /&gt;
DATA qazwsx SCAN&lt;br /&gt;
DATA qazwsx SECTOR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The middle word is hardcoded in the game. &amp;lt;code&amp;gt;GETERM.DOC&amp;lt;/code&amp;gt; calls it the terminal-program password, intended to keep everyday users from using these commands. Because that same word is published in the documentation and source, it is not meaningful authentication. A client must repeat it with every DATA request; there is no session-level enable state.&lt;br /&gt;
&lt;br /&gt;
=== REPORT ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DATA qazwsx REPORT&amp;lt;/code&amp;gt; emits user and ship structures as records named &amp;lt;code&amp;gt;UD1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UD2&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;SD1&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;SD7&amp;lt;/code&amp;gt;. Some fields duplicate information available through ordinary reports, including the user ID, score, cash, population, ship name, inventory, position, energy, installed equipment, and registered kills.&lt;br /&gt;
&lt;br /&gt;
Other fields expose implementation details that are not normally available to the player:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Exposed value&lt;br /&gt;
! Why it is normally hidden&lt;br /&gt;
|-&lt;br /&gt;
| Numeric ship-class index&lt;br /&gt;
| Normal reports identify the class by name rather than exposing its table index.&lt;br /&gt;
|-&lt;br /&gt;
| Exact numeric hull damage&lt;br /&gt;
| &amp;lt;code&amp;gt;REPORT SYSTEMS&amp;lt;/code&amp;gt; describes damage in words instead of displaying the internal damage value.&lt;br /&gt;
|-&lt;br /&gt;
| Raw speed value&lt;br /&gt;
| The normal navigation report converts internal speed units into the displayed impulse or warp value.&lt;br /&gt;
|-&lt;br /&gt;
| Raw phaser state&lt;br /&gt;
| The command exposes the internal phaser charge or damage counter rather than only the player-facing operative/inoperative state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lastfired&amp;lt;/code&amp;gt;&lt;br /&gt;
| This is the internal user-channel attribution used when deciding who receives credit for a destruction. It is not a player-visible ship statistic.&lt;br /&gt;
|-&lt;br /&gt;
| Raw shield state and charge&lt;br /&gt;
| Ordinary reports present the shield state and, while shields are raised, a percentage. DATA exposes the underlying state value and charge.&lt;br /&gt;
|-&lt;br /&gt;
| Raw cloak state&lt;br /&gt;
| This reveals cloak transition and damage-state values rather than only the visible cloak status.&lt;br /&gt;
|-&lt;br /&gt;
| Tactical and helm damage counters&lt;br /&gt;
| Normal reports say that these systems are damaged. They do not reveal the exact internal repair magnitude.&lt;br /&gt;
|-&lt;br /&gt;
| Training counter&lt;br /&gt;
| This is an internal state used by the training sequence, not gameplay information reported to the player.&lt;br /&gt;
|-&lt;br /&gt;
| Raw location code&lt;br /&gt;
| The &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt; field encodes whether the ship is in space, at Zygor, or orbiting a numbered planet. Normal output describes the location instead.&lt;br /&gt;
|-&lt;br /&gt;
| Incoming weapon slots&lt;br /&gt;
| Every incoming torpedo and missile slot includes its raw source channel and remaining distance. Classic has no equivalent player-facing ordnance report.&lt;br /&gt;
|-&lt;br /&gt;
| Jammer state, hostile state, and combat-exit timer&lt;br /&gt;
| These are internal flags or countdowns. Their exact values are not shown during normal play.&lt;br /&gt;
|-&lt;br /&gt;
| Maintenance, hyper-phaser, and fire-control counters&lt;br /&gt;
| These expose internal repair or cooldown state. Classic does not even list damaged fire control in &amp;lt;code&amp;gt;REPORT SYSTEMS&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Self-destruct and ship-status values&lt;br /&gt;
| The player can see a self-destruct countdown as it runs, but cannot ordinarily query its raw counter or the ship record&#039;s internal status code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The result is more than a machine-readable version of the visible reports. It is effectively a partial dump of the user and ship records, including values that can reveal combat state and implementation details to a player or automated client.&lt;br /&gt;
&lt;br /&gt;
=== SCAN ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DATA qazwsx SCAN&amp;lt;/code&amp;gt; updates the scanning table and emits the player&#039;s scan range, the player&#039;s own position, and one row for every visible ship contact. A contact row includes:&lt;br /&gt;
&lt;br /&gt;
* its scan-table letter;&lt;br /&gt;
* exact galactic [[Sector|sector]] coordinates;&lt;br /&gt;
* exact local coordinates within the sector;&lt;br /&gt;
* distance, [[Bearing|bearing]], relative heading, and speed;&lt;br /&gt;
* its numeric class index and class name.&lt;br /&gt;
&lt;br /&gt;
A normal range scan plots contacts and gives useful navigational information, but it does not reveal every contact&#039;s exact sector and local coordinates. Identifying a ship&#039;s class normally requires a ship scan, which can notify the target. Classic DATA SCAN therefore provides precise and sometimes otherwise unavailable information without that notification.&lt;br /&gt;
&lt;br /&gt;
When the player&#039;s jammer field is active, classic DATA SCAN suppresses the contact rows and prints &amp;lt;code&amp;gt;** Jammed **&amp;lt;/code&amp;gt;. It does use the normal scan-table construction, so it does not simply reveal every cloaked or out-of-range ship. However, it bypasses the command-level damaged-tactical-system check used by the ordinary [[Scan command|&amp;lt;code&amp;gt;SCAN&amp;lt;/code&amp;gt;]] command, allowing the data scan to be requested when the player&#039;s tactical scanners are inoperative.&lt;br /&gt;
&lt;br /&gt;
=== SECTOR ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DATA qazwsx SECTOR&amp;lt;/code&amp;gt; loads the current sector and emits its exact coordinates followed by every planetary object, including each object&#039;s number, exact local coordinates, and raw object type.&lt;br /&gt;
&lt;br /&gt;
Unlike the ordinary sector scan, this path does not apply the tactical-system or jamming checks. A player can therefore use it to recover precise sector layout and object-type information while jammed or while tactical scanners are damaged. This is one of the clearest cases where the classic DATA interface leaks information that normal gameplay intentionally withholds.&lt;br /&gt;
&lt;br /&gt;
=== Protocol limitations ===&lt;br /&gt;
&lt;br /&gt;
The classic frontend interface has several limitations by modern protocol standards:&lt;br /&gt;
&lt;br /&gt;
* There is no configurable frontend identifier or pairing handshake.&lt;br /&gt;
* Access relies on a word embedded in the source code.&lt;br /&gt;
* REPORT records resemble delimited data, while SCAN and SECTOR use different, more human-oriented layouts.&lt;br /&gt;
* There are no explicit end-of-section records.&lt;br /&gt;
* User-entered text is not escaped, so delimiters in names can make parsing ambiguous.&lt;br /&gt;
* Many fields are raw structure values rather than player-visible concepts; even the fields described in &amp;lt;code&amp;gt;GETERM.DOC&amp;lt;/code&amp;gt; depend on classic&#039;s internal representation.&lt;br /&gt;
&lt;br /&gt;
== ge-next implementation ==&lt;br /&gt;
&lt;br /&gt;
ge-next replaces the classic DATA interface with a frontend protocol that avoids exposing most raw internal state. The command must first be made available through the &amp;lt;code&amp;gt;FRONTEND&amp;lt;/code&amp;gt; setting in &amp;lt;code&amp;gt;MPOGEMSG.MSG&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! FRONTEND value&lt;br /&gt;
! Behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OFF&amp;lt;/code&amp;gt;&lt;br /&gt;
| DATA behaves as an invalid command.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt;&lt;br /&gt;
| DATA sections are available immediately, although message metadata remains disabled until separately requested.&lt;br /&gt;
|-&lt;br /&gt;
| Any other string&lt;br /&gt;
| The session must send &amp;lt;code&amp;gt;DATA ON string&amp;lt;/code&amp;gt;, with an exact case-sensitive match, before using the other DATA commands.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A successful pairing returns an &amp;lt;code&amp;gt;ON:&amp;lt;/code&amp;gt; record containing the frontend identifier, project name, version, and architecture. This is an application-level pairing mechanism, not strong authentication, but it allows each game installation to be associated with an intended frontend instead of relying on a universal source-visible password.&lt;br /&gt;
&lt;br /&gt;
=== Sections ===&lt;br /&gt;
&lt;br /&gt;
The ge-next interface divides information into independently requested sections:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Command&lt;br /&gt;
! General contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA USER&amp;lt;/code&amp;gt;&lt;br /&gt;
| Player identity, finances, score, population, and related user information.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA SHIP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Ship identity, class, registered kills, communications frequency, and ship number.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA CAP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Current ship capabilities.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA INV&amp;lt;/code&amp;gt;&lt;br /&gt;
| Inventory, cargo weight, and cargo capacity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA UPG&amp;lt;/code&amp;gt;&lt;br /&gt;
| Installed upgrades and transponder state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA NAV&amp;lt;/code&amp;gt;&lt;br /&gt;
| Navigation information corresponding to &amp;lt;code&amp;gt;REPORT NAVIGATION&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA ORD&amp;lt;/code&amp;gt;&lt;br /&gt;
| Incoming ordnance information corresponding to &amp;lt;code&amp;gt;REPORT ORDNANCE&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA SYS&amp;lt;/code&amp;gt;&lt;br /&gt;
| System condition corresponding to &amp;lt;code&amp;gt;REPORT SYSTEMS&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA MSG&amp;lt;/code&amp;gt;&lt;br /&gt;
| Message-filter settings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA SCAN&amp;lt;/code&amp;gt;&lt;br /&gt;
| Parseable range-scan information.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA SHIPSCAN target&amp;lt;/code&amp;gt;&lt;br /&gt;
| Parseable ship-scan information, subject to the normal ship-scan rules and notification policy.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DATA SECTOR&amp;lt;/code&amp;gt;&lt;br /&gt;
| Parseable sector-scan information.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each data record ends in &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, and a completed section ends with &amp;lt;code&amp;gt;STOP:section*&amp;lt;/code&amp;gt;. Text fields percent-encode percent signs, commas, asterisks, carriage returns, and line feeds so that user-entered names cannot corrupt the record structure. The [https://github.com/manicpop/ge-next/blob/main/mpogemp/FRONTEND.TXT FRONTEND.TXT] file, included with ge-next, is the authoritative field-by-field protocol reference.&lt;br /&gt;
&lt;br /&gt;
=== Information visibility ===&lt;br /&gt;
&lt;br /&gt;
The ge-next routines were written to return the information represented by the corresponding player-facing commands rather than exposing raw structures. Important examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DATA SYS&amp;lt;/code&amp;gt; returns descriptive system states and follows the Enhanced Damage Control rules for whether a repair time is visible. It does not expose every raw damage counter.&lt;br /&gt;
* &amp;lt;code&amp;gt;DATA SCAN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DATA SECTOR&amp;lt;/code&amp;gt; apply the relevant range, cloak, nebula, jamming, and damaged-scanner behavior.&lt;br /&gt;
* &amp;lt;code&amp;gt;DATA SHIPSCAN&amp;lt;/code&amp;gt; uses the normal ship-scan behavior. The target receives the same scan notification it would receive from &amp;lt;code&amp;gt;SCAN SHIP&amp;lt;/code&amp;gt;, unless the normal locked-target exception applies.&lt;br /&gt;
* &amp;lt;code&amp;gt;DATA ORD&amp;lt;/code&amp;gt; resolves weapon sources into player-facing descriptions instead of exposing reusable MajorBBS channel numbers as identities.&lt;br /&gt;
* Message metadata is separately enabled with &amp;lt;code&amp;gt;DATA METADATA ON&amp;lt;/code&amp;gt;; enabling DATA alone does not turn it on.&lt;br /&gt;
&lt;br /&gt;
There are a small number of deliberate exceptions where a frontend needs information that the terminal interface does not print directly:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DATA SHIP&amp;lt;/code&amp;gt; includes the persistent [[Ship number|ship number]] so a frontend can retain per-ship settings.&lt;br /&gt;
* Mine contacts include exact distance and bearing so a frontend can plot them on a map. The terminal scan plots mines graphically but does not list those two numbers.&lt;br /&gt;
&lt;br /&gt;
These are explicit protocol decisions rather than the broad, incidental disclosure of internal fields found in the classic command.&lt;br /&gt;
&lt;br /&gt;
== ge-arena ==&lt;br /&gt;
&lt;br /&gt;
ge-arena uses the same access, framing, escaping, scan restrictions, and metadata system. It retains applicable ge-next sections and adds arena-specific records such as match state and player standings. Fields that have different meanings in an arena mode are documented separately in the ge-arena section of &amp;lt;code&amp;gt;FRONTEND.TXT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Summary of differences ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Area&lt;br /&gt;
! Classic GE&lt;br /&gt;
! ge-next&lt;br /&gt;
|-&lt;br /&gt;
| Access&lt;br /&gt;
| Hardcoded word repeated with every request&lt;br /&gt;
| Configurable per-installation setting and per-session pairing&lt;br /&gt;
|-&lt;br /&gt;
| Purpose&lt;br /&gt;
| Documented terminal-program interface used by frontends, including GECP; exposes raw state&lt;br /&gt;
| Documented frontend protocol&lt;br /&gt;
|-&lt;br /&gt;
| Information policy&lt;br /&gt;
| Exposes numerous hidden counters, channel numbers, and structure fields&lt;br /&gt;
| Generally mirrors information available through normal player commands&lt;br /&gt;
|-&lt;br /&gt;
| Scan restrictions&lt;br /&gt;
| Some DATA paths bypass damaged-scanner, notification, or jamming behavior&lt;br /&gt;
| Reuses normal visibility and notification rules&lt;br /&gt;
|-&lt;br /&gt;
| Framing&lt;br /&gt;
| Inconsistent layouts with no common terminator&lt;br /&gt;
| Named records and &amp;lt;code&amp;gt;STOP:&amp;lt;/code&amp;gt; terminators&lt;br /&gt;
|-&lt;br /&gt;
| User text&lt;br /&gt;
| Not escaped&lt;br /&gt;
| Percent-encoded where required&lt;br /&gt;
|-&lt;br /&gt;
| Message tagging&lt;br /&gt;
| None&lt;br /&gt;
| Optional, separately enabled metadata records&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[GETERM.DOC]]&lt;br /&gt;
* [[GEINST.DOC]]&lt;br /&gt;
* [[GECP]]&lt;br /&gt;
* [[Set command]]&lt;br /&gt;
* [[Scan command]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:ge-next]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=GECP&amp;diff=2138</id>
		<title>GECP</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=GECP&amp;diff=2138"/>
		<updated>2026-10-18T04:32:14Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link GECP to the classic DATA interface&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Galactic Empire Control Panel&#039;&#039;&#039; (&#039;&#039;&#039;GECP&#039;&#039;&#039;) is a graphical player frontend by Dave Walton for &#039;&#039;classic Galactic Empire&#039;&#039;. It provides a visual interface for navigation, combat, and mapping rather than replacing the game server.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Compatibility:&#039;&#039;&#039; GECP works with classic GE, not ge-next or ge-arena. Its classic protocol assumptions should not be taken as support for the later games.&lt;br /&gt;
&lt;br /&gt;
== Versions and features ==&lt;br /&gt;
The [https://www.digger.net/projects/gecp/ project page] describes a Java-based version 2, intended to run wherever Java 8 is available, and an earlier DOS version that can also be run under DOSBox. The frontend offers a map, hotkeys and macros, and controls for common ship actions such as navigation and combat. Consult the project page for downloads and installation instructions.&lt;br /&gt;
&lt;br /&gt;
GECP is a client-side aid that uses classic GE&#039;s [[Data command|DATA interface]] to obtain machine-readable ship and scan information; the BBS still runs the game. The original [[GETERM.DOC]] documents that interface for terminal-program authors. For a ge-next frontend, see [[GE3D]] and the redesigned [[Data command|DATA protocol]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Utilities]]&lt;br /&gt;
* [[Creating a keymap]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Playing Galactic Empire]]&lt;br /&gt;
[[Category:Community]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=New_command&amp;diff=2129</id>
		<title>New command</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=New_command&amp;diff=2129"/>
		<updated>2026-10-18T03:56:33Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;NEW&#039;&#039;&#039; command purchases ships and major ship equipment at Zygor. In ge-next, it also purchases permanent ship upgrades.&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NEW SHIP class&lt;br /&gt;
NEW SHIELD mark&lt;br /&gt;
NEW PHASER mark&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ge-next adds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
NEW UPGRADE&lt;br /&gt;
NEW UPGRADE number&lt;br /&gt;
NEW UPGRADE 7 [HIGH | NORMAL | LOW]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ship must be orbiting Zygor, planet 1 in sector 0 0. The purchase also requires enough cash and, where applicable, an eligible ship class. In ge-next, players whose standing with Galactic Command is too poor cannot trade at Zygor until the penalty expires.&lt;br /&gt;
&lt;br /&gt;
[[Help command|&amp;lt;code&amp;gt;HELP CLASS&amp;lt;/code&amp;gt;]] lists the available ship classes and their class numbers. &amp;lt;code&amp;gt;HELP NEWPRICE&amp;lt;/code&amp;gt; lists shield and phaser prices, but this is stored as text in the help file; it does not display configured values like HELP CLASS does. Server configuration is therefore authoritative, because prices and limits can be changed by the sysop without changing the help file to match. In fact, in classic GE, Mark-19 shields are listed at 250 million cash, but are actually set at 200 million, because the game&#039;s internal limits cap this value at 201.2 million. ge-next lowered the prices of both Mark-19 systems and updated HELP CLASS to match instead of changing the cap.&lt;br /&gt;
&lt;br /&gt;
== Purchasing a ship ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;NEW SHIP class&amp;lt;/code&amp;gt; purchases an additional ship of the selected class. It does not transform the current ship, trade it in, or immediately transfer command to the new vessel. The new ship becomes another persistent ship in the player&#039;s fleet.&lt;br /&gt;
&lt;br /&gt;
A player who enters the game without a ship receives the configured starter class free of charge. That allocation is separate from a &amp;lt;code&amp;gt;NEW SHIP&amp;lt;/code&amp;gt; purchase.&lt;br /&gt;
&lt;br /&gt;
The full class price is deducted from the player&#039;s cash. A newly purchased ship starts as a fresh vessel with:&lt;br /&gt;
&lt;br /&gt;
* Mark-1 shields and Mark-1 phasers (if this class has them&amp;lt;ref group=&amp;quot;lower-alpha&amp;quot;&amp;gt;Technically, these values are set to 1 regardless; the check for whether a class has those systems is separate.&amp;lt;/ref&amp;gt;);&lt;br /&gt;
* three flux pods;&lt;br /&gt;
* no other cargo;&lt;br /&gt;
* no damage;&lt;br /&gt;
* full energy;&lt;br /&gt;
* shields uncharged and down;&lt;br /&gt;
* a random position in sector 0 0, safely separated from its planets; and&lt;br /&gt;
* a new per-user [[Ship number|ship number]] (used to sort the ship list, not shown to player).&lt;br /&gt;
&lt;br /&gt;
The purchase fails if the player has reached the configured maximum number of ships. Classic Galactic Empire defaults to a maximum of 8 ships per player; ge-next defaults to 45.&lt;br /&gt;
&lt;br /&gt;
== Shields and phasers ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;NEW SHIELD mark&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;NEW PHASER mark&amp;lt;/code&amp;gt; replace the corresponding system on the current ship. Marks range from 1 through 19, but the selected Mark cannot exceed the maximum supported by the ship class. The purchase does not repair hull damage or unrelated systems. In classic GE and ge-next through 0.3.2, the replacement retained the old system&#039;s charge and damage state; downgrading shields could even leave the new Mark with more charge than its normal maximum. As of ge-next 0.3.3, a purchased shield starts down with zero charge, while a purchased phaser starts fully charged. This also clears damage to the system being replaced. See [[Classic bug: Replacement systems retain old charge]].&lt;br /&gt;
&lt;br /&gt;
The old system is traded in rather than discarded. Its trade-in credit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
old list price - (old list price / 3)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Integer arithmetic is used, so this is approximately two-thirds of the old system&#039;s list price. The credit is subtracted from the new system&#039;s price. If the player still owes money and the difference is less than 1,000 credits, the game charges a minimum installation fee of 1,000 credits.&lt;br /&gt;
&lt;br /&gt;
A player may also install a lower Mark. When the trade-in credit exceeds the new system&#039;s price, the excess is refunded after a fee equal to 2% of the trade-in credit. This makes deliberate downgrading possible, but prevents the player from recovering the entire credited value as cash.&lt;br /&gt;
&lt;br /&gt;
Classic Galactic Empire permits a player to purchase the same Mark already installed and still applies the replacement calculation. ge-next rejects a same-Mark purchase because no equipment change would occur. ge-next also protects cash additions from overflowing the player&#039;s cash field.&lt;br /&gt;
&lt;br /&gt;
== Upgrades in ge-next ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;NEW UPGRADE&amp;lt;/code&amp;gt; without a number lists the upgrades available to the current ship class, their prices, and whether they are already installed. &amp;lt;code&amp;gt;NEW UPGRADE number&amp;lt;/code&amp;gt; purchases an eligible upgrade.&lt;br /&gt;
&lt;br /&gt;
Upgrade cost is based on the configured base price and the current ship class&#039;s damage factor (DAMF). Consequently, installing the same upgrade can cost more on a larger or more durable class. An upgrade cannot be purchased if the class is ineligible or that ship already has it.&lt;br /&gt;
&lt;br /&gt;
The available upgrades are:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Enhanced scanners|Enhanced scanners]]&#039;&#039;&#039; provide additional scan information and reduce the effects of jamming.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Armor plating|Armor plating]]&#039;&#039;&#039; increases the ship&#039;s durability.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Acceleration boosters|Acceleration boosters]]&#039;&#039;&#039; improve acceleration.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Scan range boost|Scan range boost]]&#039;&#039;&#039; increases scanner range.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Enhanced lock|Enhanced lock]]&#039;&#039;&#039; provides additional sensor information about a locked target&#039;s activity.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Enhanced damage control|Enhanced damage control]]&#039;&#039;&#039; speeds repairs and provides repair-time information.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Transponder control|Transponder control]]&#039;&#039;&#039; changes how likely Cybertrons are to pursue the ship.&lt;br /&gt;
# &#039;&#039;&#039;[[Ship upgrades#Reinforced neutron core|Reinforced neutron core]]&#039;&#039;&#039; allows the ship to sustain overspeed for longer.&lt;br /&gt;
&lt;br /&gt;
Transponder control has three settings. It can be installed and configured in one command with &amp;lt;code&amp;gt;NEW UPGRADE 7 HIGH&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NORMAL&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;LOW&amp;lt;/code&amp;gt;. Once installed, the setting can be changed at Zygor without another purchase charge. Buying it without a setting initially selects normal operation.&lt;br /&gt;
&lt;br /&gt;
Upgrades belong to the individual ship. They cannot be transferred to another ship, returned for cash, or recovered after the ship is destroyed. Installed upgrades are listed by [[Report command|&amp;lt;code&amp;gt;REPORT UPGRADE&amp;lt;/code&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
== Classic and ge-next ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Behavior&lt;br /&gt;
! Classic Galactic Empire&lt;br /&gt;
! ge-next&lt;br /&gt;
|-&lt;br /&gt;
| Purchase additional persistent ships&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Replace shields and phasers&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Equipment trade-in and downgrade refunds&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Re-purchase the currently installed Mark&lt;br /&gt;
| Allowed and charged&lt;br /&gt;
| Rejected&lt;br /&gt;
|-&lt;br /&gt;
| Permanent ship upgrades&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|-&lt;br /&gt;
| Galactic Command standing can block Zygor trade&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references group=&amp;quot;lower-alpha&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ship upgrades]] for upgrade effects and eligibility&lt;br /&gt;
* [[Item and equipment configuration#Shields and phasers|Shield and phaser price options]]&lt;br /&gt;
&lt;br /&gt;
* Classic help: [[MBMGEHLP.MSG#HELP_NEW|NEW]], [[MBMGEHLP.MSG#HELP_NEWPRICE|NEWPRICE]]&lt;br /&gt;
* [[Help command]]&lt;br /&gt;
* [[Report command]]&lt;br /&gt;
* [[Ships]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Commands]]&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Ship_number&amp;diff=2128</id>
		<title>Ship number</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Ship_number&amp;diff=2128"/>
		<updated>2026-10-18T03:56:30Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &#039;&#039;&#039;ship number&#039;&#039;&#039; is the identifier assigned to one of a player&#039;s persistent ships. It belongs to the player&#039;s ship record, not to the temporary slot currently used to run that ship in memory.&lt;br /&gt;
&lt;br /&gt;
== Assignment ==&lt;br /&gt;
A user record keeps &amp;lt;code&amp;gt;topshipno&amp;lt;/code&amp;gt;, the highest number assigned to that player so far. Creating another ship increments that counter and places the new number in the ship record&#039;s &amp;lt;code&amp;gt;shipno&amp;lt;/code&amp;gt; field. The database identifies a persistent ship by its owner together with this ship number. The number is therefore scoped to that user&#039;s ships: different users can each have a ship number 1.&lt;br /&gt;
&lt;br /&gt;
== Fleet selection ==&lt;br /&gt;
The ship-selection routine lists a player&#039;s stored ships in ship-number order. It gives the visible entries consecutive menu choices and keeps the corresponding &amp;lt;code&amp;gt;shipno&amp;lt;/code&amp;gt; for loading the selected record. Thus a menu choice is not necessarily the ship&#039;s persistent number. If ships numbered 1 and 2 are gone but numbers 3 and 5 remain, those surviving ships can appear as choices 1 and 2; selecting choice 2 loads ship number 5. A newly created ship receives a new number rather than filling a gap, keeping the ship selection list in the order of when the ships were first acquired. Classic lists all owned ships at once; ge-next paginates the menu, restarting the displayed choices at 1 on each page. See [[Classic bug: Ship-selection output overflow]] for why pagination was needed.&lt;br /&gt;
&lt;br /&gt;
== Not a ship slot ==&lt;br /&gt;
The [[Ship slot]] is a reusable in-memory position for a currently active user or NPC. A player may leave and re-enter while retaining the same persistent ship number but using a different live slot. Scan letters are another distinct identifier: [[Scantab]] maps a player&#039;s temporary letters to current slots.&lt;br /&gt;
&lt;br /&gt;
ge-arena does not retain ordinary persistent ship records between matches, so its temporary arena ships should not be interpreted as a user&#039;s numbered fleet.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[New command]]&lt;br /&gt;
* [[Ship slot]]&lt;br /&gt;
* [[Scantab]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Ships]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Cash&amp;diff=2127</id>
		<title>Cash</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Cash&amp;diff=2127"/>
		<updated>2026-10-18T03:56:26Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Cash&#039;&#039;&#039; is the player&#039;s spendable balance for [[Buy command|cargo]], [[New command|ships]], phasers, shields, upgrades, and services such as [[Maintenance command|maintenance]]. It belongs to the player account, not to a particular ship, and occupies no cargo space. A planet&#039;s operating cash and tax balance are separate; neither is automatically available to its owner.&lt;br /&gt;
&lt;br /&gt;
== Earning and spending ==&lt;br /&gt;
Players can earn cash by [[Sell command|selling cargo]] at [[Zygor]], collecting [[Taxes|taxes]] from owned planets, and receiving applicable combat rewards. Purchases and services deduct from the player balance. When a player buys goods at an ordinary planet, the payment is added to that planet&#039;s bank; it is not paid directly into the owner&#039;s account. Owners can buy from their own planets, but they still pay from their personal cash. See [[Buy command]] and [[Economy and cargo]] for the relationship among the different balances.&lt;br /&gt;
&lt;br /&gt;
[[Gold]] is a physical inventory item, not another name for cash. It takes cargo space and can be carried, sold, or produced on a planet. An owned planet can convert gold already in its stock to planetary cash during a production update; a player does not gain that cash directly.&lt;br /&gt;
&lt;br /&gt;
== Name and display ==&lt;br /&gt;
Classic GE calls cash &#039;&#039;&#039;C&#039;s&#039;&#039;&#039; in some messages, such as purchases, sales, and equipment installation. ge-next does not assign the currency a name: those messages show the numeric amount in gold-colored text without a unit. The color does not mean the player is carrying [[Gold|gold cargo]]. Reports also label the balance as cash.&lt;br /&gt;
&lt;br /&gt;
== Storage and overflow ==&lt;br /&gt;
Classic stores player cash, planetary cash, and planetary tax in 32-bit unsigned-long fields. Their storage range is 0 through 4,294,967,295. Some classic reports format those values as signed longs: a valid balance of 2,147,483,648 can appear as -2,147,483,648 even though the stored cash has not wrapped. Some paths then interpret that negative-looking value as invalid and clear it.&lt;br /&gt;
&lt;br /&gt;
The actual unsigned wrap occurs when an unchecked addition exceeds 4,294,967,295: adding one at the maximum stores zero. Large transactions have another hazard because quantity multiplied by price can overflow before the resulting balance is updated. These problems can affect purchases, sales, tax collection, rewards, and administrator grants, as well as planetary production and stock counters. [[Classic bug: Cash and counter wraparound]] explains the arithmetic, symptoms, and specific correction in ge-next.&lt;br /&gt;
&lt;br /&gt;
ge-next checks the relevant arithmetic before changing balances, rejects or caps an operation when its result cannot fit, and displays unsigned values without interpreting the upper half of their range as negative. Its cash balances retain the same 32-bit storage limit.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Economy and cargo]]&lt;br /&gt;
* [[Gold]] and [[Taxes]]&lt;br /&gt;
* [[Buy command]], [[Buy command]], and [[Sell command]]&lt;br /&gt;
* [[Classic bug: Cash and counter wraparound]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Economy]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_player_ship_classes&amp;diff=2126</id>
		<title>Classic player ship classes</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_player_ship_classes&amp;diff=2126"/>
		<updated>2026-10-18T03:56:23Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are the stock player classes in classic GE 3.2e. A new player receives an Interceptor; later ships can be purchased at [[Zygor]]. Prices, limits, and capabilities come from the distributed [[MBMGESHP.MSG]] source. A sysop can change them. See [[Ships]] for the role of a ship in play and [[Ship class configuration]] for editing the definitions.&lt;br /&gt;
&lt;br /&gt;
== At a glance ==&lt;br /&gt;
&#039;&#039;&#039;Shield / phaser&#039;&#039;&#039; gives the highest Mark the class can install, not the equipment currently installed. &#039;&#039;&#039;Warp&#039;&#039;&#039; is rated cruising speed; &#039;&#039;&#039;scan&#039;&#039;&#039; is range in displayed distance units. Price is in cash (C&#039;s), and kill points are the class&#039;s value to an attacker.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Class !! Shield / phaser max !! Warp !! Cargo (tons) !! Scan !! Price (C&#039;s) !! Kill pts&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Interceptor || 10 / 10 || 10 || 1,000 || 100,000 || 65,000 || 750&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Stealth Fighter || 15 / 15 || 20 || 2,000 || 200,000 || 500,000 || 1,500&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Heavy Freighter || 5 / 5 || 8 || 60,000 || 50,000 || 40,000 || 500&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Destroyer || 15 / 15 || 25 || 5,000 || 100,000 || 600,000 || 2,000&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Star Cruiser || 15 / 15 || 25 || 3,000 || 200,000 || 700,000 || 5,000&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Battle Cruiser || 19 / 19 || 30 || 6,000 || 250,000 || 800,000 || 5,000&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Frigate || 12 / 12 || 30 || 12,000 || 250,000 || 1,250,000 || 5,000&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Dreadnought || 19 / 19 || 50 || 40,000 || 500,000 || 2,000,000 || 10,000&lt;br /&gt;
|-&lt;br /&gt;
| 9 || Freight Barge || 6 / 3 || 15 || 200,000 || 200,000 || 3,000,000 || 5,000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Equipment and durability ==&lt;br /&gt;
Classic torpedo and missile entries are &#039;&#039;capability flags&#039;&#039;, not launcher counts or starting ammunition. &#039;&#039;&#039;Other systems&#039;&#039;&#039; lists permitted systems and planetary attack ability. &#039;&#039;&#039;Acceleration&#039;&#039;&#039; is the class setting; &#039;&#039;&#039;DAMF&#039;&#039;&#039; describes resilience for applicable damage, with 100 as the baseline. The final column is the class&#039;s unprovoked-Cybertron-fire flag followed by its configured simultaneous pursuer limit. Cybertrons will fire unprovoked on classes set to &amp;quot;Yes,&amp;quot; the pursuer value is how many Cybertrons will be dispatched to pursue that ship. Although no classes are configure this way by default, a class set to &amp;quot;No&amp;quot; but with a positive pursuer limit will attract Cybertrons, but the Cybertrons will not fire unless provoked.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Class !! Torpedo / missile !! Other systems !! Acceleration !! DAMF !! Cyb fire / pursuers&lt;br /&gt;
|-&lt;br /&gt;
| Interceptor || Yes / No || mines, decoys, jammers, zippers || 5,000 || 90 || Yes / 1&lt;br /&gt;
|-&lt;br /&gt;
| Stealth Fighter || Yes / Yes || mines, decoys, jammers, zippers, planetary attack, cloak || 5,000 || 90 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Heavy Freighter || Yes / No || mines, decoys, jammers, planetary attack || 3,000 || 200 || No / 0&lt;br /&gt;
|-&lt;br /&gt;
| Destroyer || Yes / Yes || mines, decoys, jammers, zippers, planetary attack || 5,000 || 90 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Star Cruiser || Yes / Yes || mines, decoys, jammers, zippers, planetary attack, cloak || 10,000 || 100 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Battle Cruiser || Yes / Yes || mines, decoys, jammers, zippers, planetary attack, cloak || 3,000 || 125 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Frigate || Yes / Yes || mines, decoys, jammers, zippers, planetary attack || 10,000 || 125 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Dreadnought || Yes / Yes || mines, decoys, jammers, zippers, planetary attack, cloak || 15,000 || 125 || Yes / 2&lt;br /&gt;
|-&lt;br /&gt;
| Freight Barge || No / No || decoys, jammers, planetary attack || 1,000 || 200 || No / 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The source also defines class 41, the &#039;&#039;&#039;Sysopian Death Star&#039;&#039;&#039;, intended for Sysop use rather than ordinary play. It cannot be bought through [[New command|&amp;lt;code&amp;gt;NEW SHIP&amp;lt;/code&amp;gt;]]. To use it, a Sysop can run [[Sys command|&amp;lt;code&amp;gt;SYS CLASSLIST&amp;lt;/code&amp;gt;]] to find its class number, then &amp;lt;code&amp;gt;SYS CLASS&amp;lt;/code&amp;gt; followed by that number to change their current ship&#039;s class. With the default class table, the command is &amp;lt;code&amp;gt;SYS CLASS 41&amp;lt;/code&amp;gt;. Its exceptional values, including Warp 255 and 100,000,000 tons of capacity, are not part of normal ship progression.&lt;br /&gt;
&lt;br /&gt;
== Earlier player ships and class changes ==&lt;br /&gt;
The 3.2e lineup above was not the original one. M.B. Murdock&#039;s [[GEREADME.DOC|release notes]] record several changes to player ships:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2.0a (April 1989):&#039;&#039;&#039; Version 2 introduced multiple ship types, described as ranging from the &#039;&#039;&#039;Light Freighter&#039;&#039;&#039; to the Dreadnought. The Light Freighter was the original free starting ship. See [[GEREADME.DOC#04/29/89_Release_2.0a|2.0a]] and [[GEREADME.DOC#05/12/89_Release_2.0e|2.0e]].&lt;br /&gt;
* &#039;&#039;&#039;2.0c–2.0g (May 1989):&#039;&#039;&#039; The Heavy Freighter gained the ability to [[Attack command|attack planets]] in 2.0c: previously freighters had the cargo space to carry an invasion force but could not launch it. Fighter weight was reduced, and ship carrying capacities were increased again in 2.0g. See [[GEREADME.DOC#05/07/89_Release_2.0c|2.0c]] and [[GEREADME.DOC#05/17/89_Release_2.0g|2.0g]].&lt;br /&gt;
* &#039;&#039;&#039;2.0e (May 1989):&#039;&#039;&#039; New players began receiving an &#039;&#039;&#039;Interceptor&#039;&#039;&#039; instead of a Light Freighter so they could fight Cybertrons from the outset. This was a change to the &#039;&#039;starting ship&#039;&#039;, not proof that the Light Freighter was immediately renamed or removed: the [[GEREADME.DOC#06/15/89_Release_2.0i|2.0i notes]] still mention Light Freighters, Heavy Freighters, and Interceptors separately. The 2.0e notes also say all ships began with Mark-1 phasers and shields. See [[GEREADME.DOC#05/12/89_Release_2.0e|2.0e]].&lt;br /&gt;
* &#039;&#039;&#039;2.0h (May 1989):&#039;&#039;&#039; The release notes say [[Hyper-phasers]] were no longer identical across ship classes: Interceptors now had a harder time fighting larger ships. Phaser Marks already existed, but the notes do not specify how class and Mark affected hyper-phaser damage. See [[GEREADME.DOC#05/30/89_Release_2.0h|2.0h]].&lt;br /&gt;
* &#039;&#039;&#039;3.0i and 3.0o (1992–93):&#039;&#039;&#039; A Sysop-only &#039;&#039;&#039;Sysopian Death Star&#039;&#039;&#039; was added in 3.0i. The class table was substantially expanded in 3.0o, allowing sysops to define more classes and specify equipment eligibility and Cybertron targeting behavior per class. See [[GEREADME.DOC#10/11/92_Release_3.0i|3.0i]] and [[GEREADME.DOC#01/15/93_Release_3.0o|3.0o]].&lt;br /&gt;
* &#039;&#039;&#039;3.1b (July 1993):&#039;&#039;&#039; The &#039;&#039;&#039;Freight Barge&#039;&#039;&#039; was added to the standard table as a very large-capacity ship for supplying planetary invasions. Offensive weapon damage was also revised to account for ship size, including changes to phasers and hyper-phasers. See [[GEREADME.DOC#7/4/93_Release_3.1b|3.1b]].&lt;br /&gt;
* &#039;&#039;&#039;3.2c (December 1993):&#039;&#039;&#039; The Freight Barge was reduced in size and stripped of much of its offensive equipment after proving too effective as a fighting platform. The final 3.2e class still permits a Mark-3 phaser, but has no torpedo, missile, mine, or zipper capability; it retains its invasion role. The 3.2c release also introduced a separate [[DAMF]] value for each class, decoupling durability from cargo size. See [[GEREADME.DOC#12/14/93_Release_3.2c|3.2c]] and [[MBMGESHP.MSG]].&lt;br /&gt;
&lt;br /&gt;
In the surviving 3.2e code, hyper-phaser damage is multiplied by the attacker&#039;s installed phaser Mark and divided by a factor based on the target class&#039;s tonnage; the attacker&#039;s class also limits which Marks it can install. The surviving release notes do not establish when this Mark-based calculation was introduced, or whether the 2.0h change already used class-dependent equipment limits rather than a separate class multiplier.&lt;br /&gt;
&lt;br /&gt;
A surviving earlier ship configuration lists &#039;&#039;&#039;Light Freighter&#039;&#039;&#039; in class slot 2, whereas the distributed 3.2e table puts &#039;&#039;&#039;Stealth Fighter&#039;&#039;&#039; in that slot. Because that older file includes training-game material, it does not establish the exact stock lineup of a particular main-game release. The release notes do not say precisely when the Light Freighter disappeared from the standard selection or when the Stealth Fighter took its place. Ship tables were also customizable by sysops, so a class missing from the 3.2e default was not necessarily absent from every game.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Ships]] and [[New command]]&lt;br /&gt;
* [[Classic NPC ship classes]]&lt;br /&gt;
* [[Ship class configuration]] and [[DAMF]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Ships]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Ships&amp;diff=2125</id>
		<title>Ships</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Ships&amp;diff=2125"/>
		<updated>2026-10-18T03:56:20Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A ship is a player&#039;s way of moving through the galaxy. It carries supplies and weapons, scans nearby space, orbits planets, and can be damaged or destroyed. Ships are also part of the world around the player: Cybertrons and other automated vessels travel, fight, haul cargo, or defend territory.&lt;br /&gt;
&lt;br /&gt;
== Choosing a ship ==&lt;br /&gt;
Each ship belongs to a &#039;&#039;&#039;class&#039;&#039;&#039;, a design with its own strengths and limits. A fast scouting craft is useful for exploration; a freighter can carry far more cargo; a warship trades some flexibility for firepower and durability. No class is best at every job. A game&#039;s sysop can change the available classes, so the in-game [[Help command|&amp;lt;code&amp;gt;HELP CLASS&amp;lt;/code&amp;gt;]] display is the best guide to that installation&#039;s choices.&lt;br /&gt;
&lt;br /&gt;
A class sets limits, not the ship&#039;s complete present condition. It can say how powerful a shield or phaser the ship may install, how fast it normally travels, what it can launch, how much it can carry, and how far it can scan. The actual ship has its own equipment, supplies, damage, position, and combat record. A ship with a Mark-19 shield &#039;&#039;maximum&#039;&#039; does not necessarily have a Mark-19 shield installed.&lt;br /&gt;
&lt;br /&gt;
== Ships in play ==&lt;br /&gt;
Players explore with [[Navigation and scanning|navigation and scanners]], fight with [[Combat|weapons]] and [[shields]], move supplies in a [[ship inventory]], and repair damage through [[Maintenance|maintenance]]. [[Report command|&amp;lt;code&amp;gt;REPORT NAV&amp;lt;/code&amp;gt;]], &amp;lt;code&amp;gt;REPORT SYS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REPORT INV&amp;lt;/code&amp;gt;, and other [[Report command|reports]] show the current state of the particular ship being flown. See [[System damage|system failures]] for how individual systems can be disabled.&lt;br /&gt;
&lt;br /&gt;
A player may own multiple persistent ships and select which one to fly. A destroyed ship is lost, but the player and any other ships remain. Ships can be bought at [[Zygor]] when the player has the money and the class is offered. See [[New command]] for purchases and [[Ship number#Fleet selection|fleet selection]] for how stored ships appear on entry. ge-arena instead gives participants match-local ships: they choose from that mode&#039;s roster or receive its sole class automatically, and can respawn after being destroyed. It has no persistent player fleet.&lt;br /&gt;
&lt;br /&gt;
== Other vessels ==&lt;br /&gt;
[[Cybertrons]] are automated opponents. [[Droids]] is the source-code term for other automated ships; it does not imply that every such vessel is harmless. Their behavior, faction relationships, and population rules depend on the version. An NPC has a ship class too, but it does not buy a vessel the way a player does. See [[Droids#Factions and distress in ge-next|faction rules]] and [[Ship slot#User, Cybertron, and Droid ranges|NPC slot allocation]].&lt;br /&gt;
&lt;br /&gt;
== Stock class lists ==&lt;br /&gt;
* [[Classic player ship classes]] and [[Classic NPC ship classes]] give the shipped classic 3.2e rosters.&lt;br /&gt;
* [[ge-next player ship classes]] and [[ge-next NPC ship classes]] give the shipped ge-next rosters. Those pages also identify which class designs appear in the stock ge-arena modes.&lt;br /&gt;
&lt;br /&gt;
These lists show defaults, not a guarantee about every live BBS. The same named class can have different specifications in classic and ge-next, and a sysop can change either table.&lt;br /&gt;
&lt;br /&gt;
== How classes are defined ==&lt;br /&gt;
For readers who want the mechanics: class definitions live in a compiled [[Ship class configuration|ship-class table]]. A class number identifies a design; a [[ship number]] identifies an individual owned vessel, while a [[ship slot]] is its place in the game&#039;s active tables. Depending on the build, the class table also includes purchase value, kill points, [[DAMF|damage factor]], and settings used by automated ships. Those are configuration details rather than a complete description of a ship&#039;s role in play. See [[Ship class configuration]], [[Scoring and rosters]], and [[Data structures]] for more.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Classic player ship classes]]&lt;br /&gt;
* [[ge-next player ship classes]]&lt;br /&gt;
* [[Classic NPC ship classes]]&lt;br /&gt;
* [[ge-next NPC ship classes]]&lt;br /&gt;
* [[Ship class configuration]]&lt;br /&gt;
* [[Ship slot]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Ships]]&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Economy_and_cargo&amp;diff=2124</id>
		<title>Economy and cargo</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Economy_and_cargo&amp;diff=2124"/>
		<updated>2026-10-18T03:56:16Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Consolidate buying and selecting ships into focused pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Economy and cargo&#039;&#039;&#039; connects a player&#039;s cash, the goods carried by ships, and the stock and finances of planets. These are related but separate resources: transferring up an item is not the same as buying it, and cash earned by a colony does not automatically appear in its owner&#039;s account. Prices, item weights, and many production settings are configurable by the sysop; the figures on this wiki describe the distributed settings unless otherwise stated.&lt;br /&gt;
&lt;br /&gt;
== Where value is kept ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Resource !! Where it is kept !! Principal use&lt;br /&gt;
|-&lt;br /&gt;
| [[Cash|Player cash]] || User account || Buys goods, ships, equipment, and services. It is not cargo and does not consume hold space.&lt;br /&gt;
|-&lt;br /&gt;
| [[Ship inventory|Ship cargo]] || Individual ship || Carries weapons, supplies, people, and [[Gold|gold]]. Each item occupies its configured weight and may be lost when that ship is destroyed.&lt;br /&gt;
|-&lt;br /&gt;
| Planetary stock || Individual [[Planets|planet]] || Holds goods that may be produced, reserved, sold to visitors, or transferred under the applicable access rules.&lt;br /&gt;
|-&lt;br /&gt;
| Planetary cash and tax || Individual planet || Trade receipts and converted gold fund the planetary bank; tax is a separate owner-accessible balance. Neither is automatically the player&#039;s cash.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Gold is the bridge between physical cargo and money. A player can carry or sell it, and an owned planet converts gold already in its inventory into planetary cash during a production update. Gold produced on that same update normally waits until a later update for conversion. See [[Gold]], [[Cash]], and [[Taxes]].&lt;br /&gt;
&lt;br /&gt;
== Cargo and capacity ==&lt;br /&gt;
Ships carry fourteen [[Items|item types]] whose configured weights count against the ship class&#039;s cargo capacity. Cargo is distinct from installed equipment: a ship can transport missiles without a launcher or carry fighters the ability to attack planets with them. For fractional weights, capacity checks, inventory reports, and how carried quantities change, see [[Ship inventory]]. [[Ship class configuration]] explains which equipment a class can use.&lt;br /&gt;
&lt;br /&gt;
== Production and planetary wealth ==&lt;br /&gt;
A colony assigns its population&#039;s work among reproduction, food, gold, and other goods. Production depends on its environment, resources, population, cash, and the owner&#039;s choices. Its inventory and maximum stock are not unlimited. A positive planetary bank supports higher production and stock limits; high taxes can raise revenue but lower productivity and increase revolt risk. See [[Planetary production]], [[Colonizing planets]], and [[Taxes]].&lt;br /&gt;
&lt;br /&gt;
A planet can gain cash when a ship buys its goods or when stored gold is converted during a production update. An owner can manage the planet&#039;s tax and trade settings through [[Planet administration]], but its cash and stock remain planetary resources until an allowed game action moves value elsewhere. Selling goods to visiting ships, mining gold, and collecting tax are different ways to build wealth, each with different labor, transport, and risk costs.&lt;br /&gt;
&lt;br /&gt;
== Trade and transfers ==&lt;br /&gt;
Buying requires a valid orbit, available stock, the appropriate access or trade password, enough player cash, and enough cargo room. An ordinary owned planet can sell selected stock to a visitor; that purchase moves goods from the planet to the ship and pays money into the planetary bank. The owner can set sale prices and reserves. [[Zygor]] is the special neutral-zone market for buying supplies, purchasing ships and equipment, selling ship cargo, and requesting maintenance. Ships can [[Sell command|&amp;lt;code&amp;gt;SELL&amp;lt;/code&amp;gt;]] cargo to Zygor, &#039;&#039;&#039;not&#039;&#039;&#039; to an arbitrary player-owned planet. See [[Planet administration]], [[Buy command]], [[Sell command]], and [[New command]].&lt;br /&gt;
&lt;br /&gt;
A [[Transfer command|transfer]] is different from a purchase: it moves an item between a ship and an orbiting planet without using the ordinary sale transaction. Ownership and the &amp;lt;code&amp;gt;TRANSOPT&amp;lt;/code&amp;gt; setting determine when an upward withdrawal or downward deposit is allowed. In classic GE, transfers require a numeric quantity; ge-next adds shorthand directions and &amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt; forms.&lt;br /&gt;
&lt;br /&gt;
== Combat and loss ==&lt;br /&gt;
A destroyed ship loses its cargo, although a credited attacker may recover some of it if there is room aboard the winning ship. ge-next prioritizes recoverable gold before taking random portions of other eligible items. The player&#039;s account and any other persistent ships are separate from the vessel that was lost. See [[Combat]], [[Kill credit]], and [[Gold]].&lt;br /&gt;
&lt;br /&gt;
The ge-arena Hoard mode treats onboard gold as the match score. Arena ships and their planetary supplies are match-local rather than part of standard ge-next&#039;s persistent economy. Other arena modes use different scoring resources; see [[ge-arena]].&lt;br /&gt;
&lt;br /&gt;
== Numeric limits ==&lt;br /&gt;
Classic stores many cash and item counters as unsigned 32-bit values. A calculation can nevertheless overflow before the final value is checked, and displayed signed values can be misleading. Classic&#039;s cargo-weight multiplication is one example. ge-next tightened capacity and transaction calculations without changing the basic distinction among player cash, ship cargo, and planetary resources. See [[Classic bug: Cargo weight overflow]] and [[Classic bug: Cash and counter wraparound]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Items]] and [[Ship inventory]]&lt;br /&gt;
* [[Cash]], [[Gold]], and [[Taxes]]&lt;br /&gt;
* [[Planet administration]], [[Buy command]], [[Sell command]], and [[Transfer command]]&lt;br /&gt;
* [[Planetary production]] and [[Zygor]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Economy]]&lt;br /&gt;
[[Category:Game reference]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Classic_bug:_CYBGOLD_zero_crashes_Cybertron_creation&amp;diff=2113</id>
		<title>Classic bug: CYBGOLD zero crashes Cybertron creation</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Classic_bug:_CYBGOLD_zero_crashes_Cybertron_creation&amp;diff=2113"/>
		<updated>2026-10-18T02:58:18Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Document CYBGOLD zero-divisor crash in classic GE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Classic bug&lt;br /&gt;
|id=GE-BUG-058&lt;br /&gt;
|affected=Classic Galactic Empire 3.2e when CYBGOLD is configured as 0&lt;br /&gt;
|status=Verified in published source; runtime crash has not been reproduced here&lt;br /&gt;
|fixed=ge-next 0.2 Cybertron gold rewrite&lt;br /&gt;
|source=&amp;lt;code&amp;gt;CYBGOLD&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;MBMGEMSG.MSG&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;cyb_init()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GECYBS.C&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
The classic &amp;lt;code&amp;gt;CYBGOLD&amp;lt;/code&amp;gt; option permits zero, a reasonable setting for a game whose [[Cybertrons]] should carry no gold. Classic accepts that value at startup but uses it as the divisor of a remainder operation when it creates a new Cybertron. Remainder by zero is undefined in C and will ordinarily cause a divide fault when that creation path runs. The danger is delayed until gameplay: the module can start normally, and loading an existing Cybertron ship does not take this particular path.&lt;br /&gt;
&lt;br /&gt;
== Configuration and execution path ==&lt;br /&gt;
The stock configuration declares &amp;lt;code&amp;gt;CYBGOLD {Max amount of gold a cyb gets: 1200} N 0 32000&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;iniwara()&amp;lt;/code&amp;gt; loads it with the same lower bound, so neither the MSG validation range nor the game&#039;s option-reading call rejects zero:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cyb_gold = numopt(CYBGOLD,0,32000);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The NPC scheduler calls &amp;lt;code&amp;gt;cyb_init()&amp;lt;/code&amp;gt; when it fills an available automatic-ship slot. If the corresponding Cybertron ship is not already in the ship database, &amp;lt;code&amp;gt;cyb_init()&amp;lt;/code&amp;gt; creates a new ship and assigns its inventory. The gold assignment has no zero guard:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ptr-&amp;gt;items[I_GOLD] = gernd()%cyb_gold;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;code&amp;gt;CYBGOLD=0&amp;lt;/code&amp;gt;, this evaluates &amp;lt;code&amp;gt;gernd()%0&amp;lt;/code&amp;gt;. The failure can therefore occur when the first new Cybertron is generated or later when an NPC slot is repopulated. Existing saved Cybertron ships can be loaded without executing the new-ship inventory assignment, so a running game may not fail immediately after the setting is changed.&lt;br /&gt;
&lt;br /&gt;
== Correction in ge-next ==&lt;br /&gt;
The Cybertron gold allocation was rewritten as part of the ge-next 0.2 NPC changes. It still uses &amp;lt;code&amp;gt;CYBGOLD&amp;lt;/code&amp;gt; as the upper bound of a random roll, but performs the roll only when &amp;lt;code&amp;gt;cyb_gold &amp;amp;gt; 0&amp;lt;/code&amp;gt;. A newly initialized ship starts with zero gold, so a zero setting leaves it with none and never evaluates a zero divisor. Current ge-next retains that guard; ge-arena also guards the roll and only assigns Cybertron gold for Hoard mode.&lt;br /&gt;
&lt;br /&gt;
For a classic-compatible fix, test &amp;lt;code&amp;gt;cyb_gold&amp;lt;/code&amp;gt; before taking a remainder and assign zero gold when the configured value is zero. Raising the configured minimum to one would avoid the crash but would remove the advertised no-gold setting.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Main configuration reference]]&lt;br /&gt;
* [[Cybertrons]]&lt;br /&gt;
* [[Classic bug: NPC class slot crowding]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Classic bugs: NPCs]]&lt;br /&gt;
[[Category:Classic bugs: Numeric correctness]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
	<entry>
		<id>https://manicpop.org/gewiki/index.php?title=Planetary_production&amp;diff=2097</id>
		<title>Planetary production</title>
		<link rel="alternate" type="text/html" href="https://manicpop.org/gewiki/index.php?title=Planetary_production&amp;diff=2097"/>
		<updated>2026-10-18T02:12:28Z</updated>

		<summary type="html">&lt;p&gt;CodexBot: Link and refine MSG option references&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Planetary production&#039;&#039;&#039; is what happens during one call to [[Source code#routine-multiply|&amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt;]]: food and population are checked, existing gold is converted, items are produced, taxes are collected, and revolt may occur. This page follows the classic &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt; calculation in order and notes ge-next changes to the calculations and reports. It does not run merely because a player visits or scans a planet. See [[Planetary update cycle]] for &#039;&#039;when&#039;&#039; &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; schedules and repeats these passes, including ge-next timestamps and catch-up. For claiming and managing a colony, see [[Colonizing planets]] and [[Planet administration]].&lt;br /&gt;
&lt;br /&gt;
== 1. Food and population ==&lt;br /&gt;
Troops eat first. The required number of food cases is &amp;lt;code&amp;gt;floor(troops / 100)&amp;lt;/code&amp;gt;. If that exceeds current food stock, &amp;lt;code&amp;gt;floor(troops / 8)&amp;lt;/code&amp;gt; perish. The game then subtracts food for the &#039;&#039;remaining&#039;&#039; troops, or sets food to zero if the remainder is insufficient. A troop force below 100 has a zero-case requirement, so this check neither feeds nor starves it.&amp;lt;ref name=&amp;quot;classic-troops&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 206–209 and 222–230.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Men are checked against the food left after troops have eaten. If &amp;lt;code&amp;gt;floor(men / 100)&amp;lt;/code&amp;gt; exceeds that stock, &amp;lt;code&amp;gt;floor(men / 8)&amp;lt;/code&amp;gt; perish. A population below 100 likewise has no integer food requirement. Classic GE performs this starvation check but never subtracts food for surviving men, so food can support them repeatedly without being consumed.&amp;lt;ref name=&amp;quot;classic-men&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 234–245. The classic routine has no subsequent food subtraction for men.&amp;lt;/ref&amp;gt; ge-next adds the configurable &amp;lt;code&amp;gt;MENEAT&amp;lt;/code&amp;gt; option, enabled in its stock settings: after the starvation check, surviving men consume one food case per 100, using integer division. See [[Classic bug: Men do not consume food]].&lt;br /&gt;
&lt;br /&gt;
== 2. Tax factor and existing gold ==&lt;br /&gt;
The production factor attributable to tax is &amp;lt;code&amp;gt;1 − tax rate / 120&amp;lt;/code&amp;gt;. At a rate of 0, this factor is 1; at 100, it is one sixth. This reduces output and effective stock maxima, not just the amount credited to the owner&#039;s tax bank.&amp;lt;ref name=&amp;quot;classic-taxfactor&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, line 257.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, the planet converts &#039;&#039;gold already in inventory&#039;&#039; to planetary cash at the configured base gold price, then clears that old gold stock. With the stock price of 1,000, ten stored gold add 10,000 to the planet&#039;s bank. Gold produced later in this pass is normally available for conversion on a later pass, not immediately.&amp;lt;ref name=&amp;quot;classic-gold&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 261–265.&amp;lt;/ref&amp;gt; Classic&#039;s unchecked multiplication can overflow near its numeric limit; ge-next caps the addition. See [[Gold]] and [[Cash]].&lt;br /&gt;
&lt;br /&gt;
== 3. Production, one item at a time ==&lt;br /&gt;
The game processes fourteen active [[Items|item types]] in inventory order: men, missiles, torpedoes, ion cannons, flux pods, food, fighters, decoys, troops, zippers, jammers, mines, gold, and spies. For &#039;&#039;each&#039;&#039; item it calculates an output quantity, reduces planetary cash, decides whether a funded-production bonus applies, computes a new maximum, and updates stock. Men are processed first, so the increased population is used to calculate every later item&#039;s output.&lt;br /&gt;
&lt;br /&gt;
=== Base output ===&lt;br /&gt;
The configured production rate is first divided by 10,000.&amp;lt;ref name=&amp;quot;classic-rate&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, line 274.&amp;lt;/ref&amp;gt; Using the current population, the owner&#039;s percentage allocation, and that rate, the unadjusted output is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;men × (allocation / 100) × (production rate / 10000) ÷ 6 ÷ 7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalently, when allocation is entered as the integer percentage from 0 through 100:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;men × allocation × production rate ÷ 42,000,000&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These divisions are floating-point operations at this stage; the game truncates later when adding the produced amount to stock.&amp;lt;ref name=&amp;quot;classic-base&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, line 278.&amp;lt;/ref&amp;gt; For example, 100,000 men, a 10% torpedo allocation, and the stock torpedo rate of 500 give about 11.9048 torpedoes before planetary modifiers.&lt;br /&gt;
&lt;br /&gt;
=== Planet quality and tax ===&lt;br /&gt;
Poor, marginal, good, and very good each correspond to values 0, 1, 2, and 3. The quality factor is &amp;lt;code&amp;gt;(environment + resources + 2) / 4&amp;lt;/code&amp;gt;, ranging from 0.5 for poor/poor to 2 for very-good/very-good.&amp;lt;ref name=&amp;quot;classic-quality&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, line 280.&amp;lt;/ref&amp;gt; The tax factor from step 2 is multiplied into that quality factor.&amp;lt;ref name=&amp;quot;classic-quality-tax&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, line 282.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good/marginal planet has a quality factor of &amp;lt;code&amp;gt;(2 + 1 + 2) / 4 = 1.25&amp;lt;/code&amp;gt;. With 10% tax, its combined quality-and-tax factor is &amp;lt;code&amp;gt;1.25 × (1 − 10 / 120) ≈ 1.14583&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Cash spent and funded bonus ===&lt;br /&gt;
Before producing &#039;&#039;each&#039;&#039; item, the bank keeps a condition-dependent fraction of its current cash. The retained fraction is &amp;lt;code&amp;gt;0.95 − (6 − environment − resources) / 10&amp;lt;/code&amp;gt;: 95% for very-good/very-good, 35% for poor/poor, and a ten-percentage-point step for each change in either rating. The new cash balance is truncated to a whole number after every item.&amp;lt;ref name=&amp;quot;classic-cash&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 284–286.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If any cash remains &#039;&#039;after&#039;&#039; that item&#039;s deduction, its output factor is multiplied by 1.5. The same factor also raises that item&#039;s effective stock maximum. The check happens afresh for every item; a bank that reaches zero partway through the list gives no bonus to later items.&amp;lt;ref name=&amp;quot;classic-bonus&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 288–289.&amp;lt;/ref&amp;gt; Cash is reduced for every item even when its production allocation is zero.&lt;br /&gt;
&lt;br /&gt;
For example, the following balances result from a good/marginal planet beginning the item loop with 10,000 cash (65% retained per item) and a poor/marginal planet beginning with 5,000 (45% retained). The bonus applies to an item only when its balance in the relevant column is above zero.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item !! Good/marginal cash after deduction !! Poor/marginal cash after deduction&lt;br /&gt;
|-&lt;br /&gt;
| Men || 6,500 || 2,250&lt;br /&gt;
|-&lt;br /&gt;
| Missiles || 4,225 || 1,012&lt;br /&gt;
|-&lt;br /&gt;
| Torpedoes || 2,746 || 455&lt;br /&gt;
|-&lt;br /&gt;
| Ion cannons || 1,784 || 204&lt;br /&gt;
|-&lt;br /&gt;
| Flux pods || 1,159 || 91&lt;br /&gt;
|-&lt;br /&gt;
| Food || 753 || 40&lt;br /&gt;
|-&lt;br /&gt;
| Fighters || 489 || 18&lt;br /&gt;
|-&lt;br /&gt;
| Decoys || 317 || 8&lt;br /&gt;
|-&lt;br /&gt;
| Troops || 206 || 3&lt;br /&gt;
|-&lt;br /&gt;
| Zippers || 133 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Jammers || 86 || 0&lt;br /&gt;
|-&lt;br /&gt;
| Mines || 55 || 0&lt;br /&gt;
|-&lt;br /&gt;
| Gold || 35 || 0&lt;br /&gt;
|-&lt;br /&gt;
| Spies || 22 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first planet receives the bonus for all fourteen items; the second loses it beginning with jammers. Men need only one cash unit &#039;&#039;after&#039;&#039; the first deduction to receive the bonus, but one unit &#039;&#039;before&#039;&#039; that deduction is insufficient: it is truncated to zero for every planet quality. The minimum starting bank for the men bonus is 2 cash where 55%–95% is retained, or 3 cash where 35%–45% is retained. For the stock arithmetic, the following starting balances are the minimum that leave at least one cash unit after all fourteen deductions:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Cash retained per item !! Planet-quality combinations !! Minimum starting cash&lt;br /&gt;
|-&lt;br /&gt;
| 95% || Very good / very good || 15&lt;br /&gt;
|-&lt;br /&gt;
| 85% || Good / very good; very good / good || 37&lt;br /&gt;
|-&lt;br /&gt;
| 75% || Very good / marginal; good / good; marginal / very good || 115&lt;br /&gt;
|-&lt;br /&gt;
| 65% || Very good / poor; good / marginal; marginal / good; poor / very good || 865&lt;br /&gt;
|-&lt;br /&gt;
| 55% || Good / poor; marginal / marginal; poor / good || 6,170&lt;br /&gt;
|-&lt;br /&gt;
| 45% || Marginal / poor; poor / marginal || 106,012&lt;br /&gt;
|-&lt;br /&gt;
| 35% || Poor / poor || 2,732,598&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These are starting balances &#039;&#039;after&#039;&#039; the earlier conversion of stored gold. They do not mean that a colony must hold that much cash to produce anything; they are thresholds for keeping the 1.5 multiplier on every item through the end of this pass.&lt;br /&gt;
&lt;br /&gt;
=== Add output and apply the maximum ===&lt;br /&gt;
The game multiplies base output by the quality, tax, and optional cash factors, truncates the produced quantity, and adds it to the existing stock.&amp;lt;ref name=&amp;quot;classic-output&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 290–291.&amp;lt;/ref&amp;gt; In the 100,000-men torpedo example, &amp;lt;code&amp;gt;11.9048 × 1.14583&amp;lt;/code&amp;gt; produces 13 whole torpedoes. With the 1.5 cash bonus it produces 20.&lt;br /&gt;
&lt;br /&gt;
The same final factor scales the item&#039;s configured planetary maximum, which is also truncated to a whole number.&amp;lt;ref name=&amp;quot;classic-max&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 295–297.&amp;lt;/ref&amp;gt; The stock torpedo maximum of 59,833 becomes 68,558 on that good/marginal, 10%-tax planet, or 102,837 with the cash bonus. A tax increase or depleted bank can therefore reduce the effective maximum &#039;&#039;below stock already held&#039;&#039;; an update may discard goods even when the production rate is zero.&lt;br /&gt;
&lt;br /&gt;
Classic sends a maximum-stock report when the previous quantity is at or below the calculated maximum and the proposed quantity reaches or exceeds it. Equality is sufficient, so a planet sitting exactly at a maximum can send repeated notices even without new production.&amp;lt;ref name=&amp;quot;classic-report&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 313–326.&amp;lt;/ref&amp;gt; The proposed quantity is then capped at the effective maximum and stored.&amp;lt;ref name=&amp;quot;classic-cap&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 328–333.&amp;lt;/ref&amp;gt; ge-next changed the notification condition so mere equality no longer repeats the notice; its catch-up passes also suppress mail until the final pass. See [[Classic bug: Disabled production repeats maximum-stock notices]].&lt;br /&gt;
&lt;br /&gt;
== 4. Taxes and revolt ==&lt;br /&gt;
After all items have been processed, the tax bank gains &amp;lt;code&amp;gt;floor((tax rate / 1200) × current men)&amp;lt;/code&amp;gt;, using the population &#039;&#039;after&#039;&#039; the men-production step.&amp;lt;ref name=&amp;quot;classic-taxbank&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 335–338.&amp;lt;/ref&amp;gt; At 10% tax and 100,000 men, this adds 833 credits to the tax bank. The planetary production bank and the owner&#039;s personal cash remain separate; see [[Taxes]].&lt;br /&gt;
&lt;br /&gt;
For a planet not already marked &amp;lt;code&amp;gt;**Free**&amp;lt;/code&amp;gt;, the revolt-pressure value is &amp;lt;code&amp;gt;men × (tax rate / 120) × 0.35&amp;lt;/code&amp;gt;. If that value is &#039;&#039;greater than&#039;&#039; the current troop count, that pass has a one-in-ten revolt chance. Troops at or above the threshold prevent revolt through this particular test.&amp;lt;ref name=&amp;quot;classic-revolt&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 348–359.&amp;lt;/ref&amp;gt; With 100,000 men and a 10% tax rate, at least 2,917 troops are needed to avoid the test. If the shortage persists across many passes, repeated 10% chances make revolt increasingly likely.&lt;br /&gt;
&lt;br /&gt;
On revolt, the planet keeps &amp;lt;code&amp;gt;floor(troops / divisor)&amp;lt;/code&amp;gt; troops, where the randomly selected divisor is an integer from 2 through 9; the rest die and ownership changes to &amp;lt;code&amp;gt;**Free**&amp;lt;/code&amp;gt;.&amp;lt;ref name=&amp;quot;classic-survivors&amp;quot;&amp;gt;Published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, lines 363–364.&amp;lt;/ref&amp;gt; Classic&#039;s revolt message mislabels the surviving count as the number killed; ge-next corrects that report and updates the former owner&#039;s planet count. See [[Classic bug: Revolt troop losses are reversed]].&lt;br /&gt;
&lt;br /&gt;
== Source notes ==&lt;br /&gt;
The 17 references below give line numbers in the published classic 3.2e &amp;lt;code&amp;gt;GEPLANET.C&amp;lt;/code&amp;gt;, not the reorganized ge-next source. The scheduling routine is &amp;lt;code&amp;gt;plartia()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;GEMAIN.C&amp;lt;/code&amp;gt;; its classic and ge-next behavior is covered at [[Planetary update cycle]]. The basic &amp;lt;code&amp;gt;multiply()&amp;lt;/code&amp;gt; sequence above remains recognizable in ge-next. The formulas describe normal numeric ranges; separate overflow bugs can change results near storage limits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Colonizing planets]], [[Planet administration]], and [[Planets]]&lt;br /&gt;
* [[Items]], [[Item and equipment configuration]], [[Gold]], [[Taxes]], and [[Economy and cargo]]&lt;br /&gt;
* [[Planetary update cycle]] and [[Classic bug: Cash and counter wraparound]]&lt;br /&gt;
&lt;br /&gt;
{{GE navigation}}&lt;br /&gt;
[[Category:Planets]]&lt;br /&gt;
[[Category:Economy]]&lt;/div&gt;</summary>
		<author><name>CodexBot</name></author>
	</entry>
</feed>