A personal fan project · not for sale · not affiliated with anyone
I own a copy of Premier Manager 98 on PC. This project takes that copy apart — the executable, the art archives, the club and player database — and rebuilds the game as an Android app, screen by screen, against the original's own bytes.
It is a hobby, for my own use. Nothing is sold, nothing is monetised, and no original game data ships inside the app that did not come off my own disc. If you do not own the game, this is a read about how a 1998 football manager works under the bonnet, not a way to get it for free.
One tap downloads the current build straight to your phone. Android only. You will need to allow "install from this source" when your phone asks.
Download PM98 ↓Filenames change every build on purpose, so your phone can never serve you
a stale cached APK. If the link 404s, a newer build has landed — grab the newest
pm98-*.apk from the releases page.
Every screenshot below is the original 1998 PC game, captured running. They are what the port is measured against, screen by screen and pixel by pixel.
Every chance is resolved by one comparison: rand()%130 < GKSAVE. A
keeper on GKSAVE 99 stops 99 chances in 130 — 76%. A keeper on 60 stops
46%. Across the six chances a match the engine allows, that is the difference
between conceding about one and a half goals and conceding about three.
Why: it is the only per-player number that touches the goal decision itself. STR only sets how many chances happen; the keeper decides what happens to each one.
GKSAVE is HANDLING +10 in slot 0, clamped to 99. So every keeper from HANDLING 89 upward is literally the same keeper to the engine.
Schmeichel (HANDLING 91) costs £8,500,000 and £1,000,000 a year. Köpke (HANDLING 95, Olympique M.) costs £450,000 and £125,000. Eriksson (HANDLING 90, Oporto) costs £625,000 and £200,000. All three are GKSAVE 99. You can save eight million pounds and half your wage bill on the single most important position in the game, and lose nothing at all.
Why: the +10 pushes anyone at 89 or above past the clamp. Above the clamp the engine cannot tell them apart.
The +10 is a slot-0 bonus, not a position bonus. And the save gate is skipped entirely if the defending keeper's SEL is zero — an empty keeper slot means every single chance scores. If your keeper is injured or suspended, put someone in that slot. Anyone. An outfielder on HANDLING 15 still saves 11% of chances; an empty slot saves none.
Why: the engine checks the defending side's participant 0 and returns early on SEL == 0 without rolling the save at all.
Chances are rand()%8 + own_avgSTR - opp_avgSTR - 1, then hard-capped at
3 - rand()%3. That cap is 1, 2 or 3 — and it is applied after
your strength advantage.
So an eight-point average-STR edge over the opposition already puts you over the cap in most halves. Beyond that, more strength buys you literally nothing. A squad averaging STR 90 and a squad averaging STR 82 generate the same capped three chances against a mid-table side.
Why: the cap is unconditional. The only thing a huge STR edge still does is stop you falling into the negative branch, where you get a smaller rescue draw.
Before STR reaches the engine it passes a position-fit gate. A defender whose slot sits too far forward, a midfielder outside the middle band, an attacker not far enough up — each takes STR × 3/4. A keeper in an outfield slot, or an outfielder in the keeper slot, takes STR ÷ 2.
Since chances are driven by the average STR of the eleven, three men out of position drags your whole team's chance count down.
Why: the gate compares each man's role byte against his own formation slot's pitch coordinates. It is not fatigue and not form — it is geometry, and it is entirely under your control on the LINE-UP screen.
The scorer roulette weights the fine positions:
[0, 0, 3, 3, 3, 7, 7, 12, 10, 35, 10, 12, 15, 18, 15, 3, 18, 18, 10].
Centre-forward (index 9) carries 35. A full-back carries 3. Keepers
carry zero and are skipped.
Nothing about shooting, finishing or form enters. If you want your man to win the golden boot, put him at index 9 — he becomes roughly twelve times likelier to be credited than a defender, purely by standing there.
Why: the roulette is over position weights only. A player is also skipped if he already carries two build-up markers or a pending shot, which is why your 35-weight striker occasionally goes missing.
The extra-time chance loop is a different formula and it has no cap:
(own_avg - opp_avg)/6 - 1 + rand()%3, and then the loop keeps going while
rand()%4 == 0. A big strength edge that was being thrown away by the cap for
ninety minutes finally converts.
The read: in cup competition, a genuinely superior squad is more likely to win the longer the tie runs. In the league, where there is no extra time, it is not.
Why: the 3 - rand()%3 clamp exists only in the two
normal halves. The extra-time tail loop was written without it.
The shootout is s0 = rand()%6; s1 = rand()%6; and then both are nudged
until they differ. Not one player attribute is consulted. Not the keeper's, not
the takers'. The engine then picks names at random to hang the converted penalties on,
purely for the read-out.
Why: the shootout records an outcome, not a contest. Penalty events are also excluded from the scoreline entirely.
Field three or more selected players with an attacker role and switch THREE UP FRONT on in OPTIONS. Two things happen for that side: the chance count is floored at 3 per half, and the opposing keeper's save gate is skipped entirely. Net effect: six goals a match, unless the ordinary rolls give you more.
Measured against the real 1998 program, patched and run in an emulator on the same four seeds: stock gives 3–2, 3–3, 2–1, 4–2. Hacked gives 6–2, 6–2, 6–0, 6–3.
Three honest caveats. It is off by default, and with it off the engine is bit-for-bit what it always was. It touches instantly-played matches only — a watched match is unaffected. And the computer gets it too: the trigger is evaluated per side, so an AI team that happens to field three forwards gets the same buff against you. Extra-time loops are not patched.
Why it exists: it came out of finding that no tactic on the TEAM TACTICS screen can move a scoreline, and that a match is capped at three chances a side. The cap was patched out of the real program first, and then the patch was ported.
Neither is in the engine's six fields. What they do drive is the displayed RATING = (VE + RE + AG + CA + FITNESS + MORALE) / 6, which drives the computer's own team selection, and which is what the board looks at when it looks at you.
The post-match deltas are worth knowing: played +3 fitness / +3 morale, bench −1 / −2, out of the sixteen −2 / −4. And your best players suffer more for being left out — anyone with quality 81 or above takes an extra point of morale damage on every one of those rows.
The result delta lands on every player at once: a home win over a same-sized club is +8, a home draw is −2, a home defeat is −10. Away: win +10, draw +5, defeat −4. A small club winning away at a giant takes +20; the giant losing that game at home takes −24.
Why it matters anyway: at season start morale is 90 + a random 0–9 and fitness is knocked halfway toward 40 — a fresh squad starts on 70 fitness, which is exactly what the real game shows in week one.
Displayed morale carries a club term. Compare a player's wage against the squad average: up to 4× the average → +8 morale. Up to 8× → +4. Above 8× → nothing. There is also a gate-receipts term worth up to +8, which only switches on when your latest home gate cleared roughly a million.
Why: it is computed at render time from the club's wage bill and squad count, so it moves the moment you sign someone on a silly contract.
The board does not review you continuously. It reviews you on a fixed schedule, and it only fires if you were below expectation at the previous checkpoint and have not recovered by this one:
"Below expectation" is league position against your club's own band. In the Premier League: band 1 must stay above 8th, band 2 above 15th, band 3 above 17th. The elite band 0 is judged on points instead — you are in trouble when the leader is 7 or more points clear of you. In the lower divisions it is 6th / 13th / 15th depending on your band.
The practical read: one good month timed before week 14, 22, 26 or 34 saves your job outright. A terrible run between checkpoints costs you nothing at all, as long as you have climbed back by the gate.
Four consecutive weeks with a negative bank balance and you are gone, regardless of where you sit in the table. And if your squad falls to fifteen players or fewer you are gone as well — that check is always armed, in both career modes, and no flag in the retail build waives it.
Why: the financial sack is a counter that increments on a negative balance and fires at 4. The squad-minimum sack reads the squad count directly.
There is no valuation curve and no stored price on a player. Fee and wage are read from two 702-entry tables inside the executable:
AV = (VE + RE + AG + CA) >> 2 abilityTier = AV≥95:0 ≥90:1 ≥85:2 ≥80:3 ≥75:4 ≥70:5 ≥65:6 ≥60:7 else:8 ageTier = age<20:0 <23:1 <26:2 <30:3 <33:4 else:5 idx = stature*54 + abilityTier*6 + ageTier fee = feeTable [idx] * 5000 wage = wageTable[idx] * 5000 per year
stature is the selling club's standing, 0 (elite) to 12 (bottom). Age is a plain calendar subtraction — season-start year minus birth year, no birthday adjustment — which is exactly the age the player's card prints. Checked against the real TRANSFER MARKET screen: every witnessed row exact.
Take a 24-year-old on AV 80–84. At a stature-0 club he costs £8,500,000. At stature 3 — a weaker Premier League side — £2,000,000. At stature 7, a Division Two club, £375,000. Same player, same attributes, same age.
So: shop downwards, and shop abroad. Shevchenko at Dinamo Kiev is £850,000. Kluivert at Milan, comparable numbers, is £12,500,000.
Why: stature is the leading term of the index, and it dominates everything else in the table.
The ability tiers are steps, not a slope, and the step from tier 4 to tier 3 — that is, from AV 79 to AV 80 — is the biggest in the table. At a top club, a young player at AV 79 costs £3,250,000. The same age at AV 80 costs £10,000,000. Three times the money for one point of average.
The other cliffs, if you need them: AV 84→85 is £10M→£14M, and AV 89→90 is £14M→£15M. Those are mild. 79→80 is the one that matters.
Why: one point of AV is worth almost nothing to the match engine — chances are capped anyway — and three times the fee to your bank. This is the single best value trade in the game.
Fee falls with every age tier: at a top club, tier 3 ability runs £10M → £9.5M → £8.5M → £7.5M → £6.5M → £5M across the six age bands.
Wage does not fall the same way — it peaks in the 26–29 band (£650,000) and drops after 30 (£550,000) and after 33 (£475,000). So the 30–32 bracket is a genuine sweet spot: cheaper to buy than a 27-year-old and cheaper to keep.
Why: the engine has no ageing decline in the fields it reads. A 34-year-old with AV 85 plays exactly like a 24-year-old with AV 85.
Your own stature band is computed from your squad's average AV. In the Premier League: average AV 80 or more → band 0; 76–79 → band 1; 72–75 → band 2; 71 or below → band 3. Division One: 64+/60-63/≤59 → 4/5/6. Division Two: 54+/52-53/≤51 → 7/8/9. Division Three: 50+/48-49/≤47 → 10/11/12.
Your band sets what your players are worth, what wages they expect at renewal, and what your ground improvements cost. Crossing a threshold steps all of that up at once. A club at average AV 79 that buys its way to 80 has just made itself considerably more expensive to run.
Why: band is the leading term of both money tables and of the ground-cost function. It is a squad-strength readout, not a reputation you earn.
The premium is monthly wage / 70 for Group 3, floored to a minimum of
£1,000 — and the ledger charges it as
premium × 12 ÷ 52 every week. So for anyone earning under
£840,000 a year — nearly your whole squad — the policy is a flat
£230.77 a week, £12,000 a year, whatever he earns. Above that it becomes
one seventieth of his wage. (Group 1 floors at £200, Group 2 at £500, on the
same ×12÷52 footing.)
When an insured Group 3 player is injured, three things happen in the ledger, all in your favour:
An injured, insured, well-paid player is cash-positive. That is the 1998 game's own model, reproduced exactly, not an interpretation of it.
Work one through. A man on £175,000 a year picks up a three-week injury. Uninsured he costs you £8,250 in hospital bills and you pay his £10,100 of wages anyway. On Group 3 the bills vanish, the £10,100 comes back, another £10,100 lands as income, and £1,000 of bonus on top — roughly a £29,000 swing against a £12,000 annual premium. One injury pays for the policy twice over.
For contrast: Group 1 reimburses nothing at all — zero percent, by the binary, not by a missing case. Group 2 pays 50%. Insuring anyone in Group 1 is money thrown away.
Do this: put every player you would actually miss on Group 3, and nobody on Group 1. Do not blanket-insure the whole squad — at £12,000 a head a twenty-man sweep is £240,000 a year, which only pays back if they keep getting hurt.
An injury's price is £1,500 per week of its total rolled duration. But the weekly bill divides that total by the weeks remaining, not the total — so the bill climbs as the man heals.
A three-week injury reads £4,500 on the INJURIES screen. You actually pay £1,500, then £2,250, then £4,500 — £8,250, nearly double the displayed price.
Why: the original divides by remaining weeks. It is reproduced verbatim, because it is what the real game charges.
Improvement cost is weeks × 5000 × P, where P falls as your
stature band rises — that is, as your club gets weaker. New seating runs
P 42.5 at a stature-0 giant down to P 10 at the bottom. Car parking runs 85 down
to 20.
That is why the biggest seating card costs Manchester United £10,624,999 and a Division Two club a fraction of it. (Yes, that price is a pound short of round. The 1998 program's own arithmetic is a pound out there, and the port keeps the missing pound, because the real game charges it.)
Cheap wins: TOILETS is a flat P 10 over one week — £50,000 at any club in the game. CHANGING ROOMS is three weeks at P 3–15. FLOODLIGHTS four weeks at P 5–25.
Why: the cost function reads the same stature band as the transfer table. Promotion makes your ground more expensive to extend, so extend it first.
There is no static domestic prize table anywhere in the executable — domestic income is a dynamic weekly float ledger, 524 bytes a week, 52 weeks a season. The one fixed, code-resident prize schedule is UEFA's:
| Event | Payment |
|---|---|
| Entry — competing in the championship | £1,000,000 |
| Every drawn match | £255,000 |
| Every match won | £510,000 |
| Qualifying for the quarter-finals | £1,500,000 |
| Qualifying for the semi-finals | £1,625,000 |
A six-win group stage is £4,060,000 with the entry fee. Reaching the semi-finals adds another £3,125,000 on top of the win money. A win is worth exactly twice a draw, so in Europe there is never a reason to play for one.
Why: these amounts are embedded in the message text itself — the string the game shows you is the constant.
A matchday's income is TICKETS + TELEVISION + PLAYERS' BONUS, and only at home. A witnessed away week reads income £0 against expenses of £233,942. Ticket price starts at £7.50.
Why it matters: the financial sack fires on four consecutive weeks in the red. A run of away fixtures is exactly when that counter climbs, so time a big outgoing — a signing, a ground project — to land on a home week.
Thirteen roles are hireable, from £1,000 to £52,000 a year. In this port, the six skill trainers, the psychologist, the assistant manager and the groundsman have no engine effect — there is no decoded source data behind them, so rather than invent one they are no-ops, and that is stated rather than hidden.
The ones that genuinely do something are the scout, the youth team scout (who gates the academy entirely — no youth scout, no youth players) and the physiotherapist.
Do this: hire a scout, a youth scout and a physio. Leave the other ten unfilled and keep the wages.
The scout's shortlist cap is (quality + 2) × 5, where quality is
counted in half-stars. A three-star scout is quality 6 and brings back 40
names; a five-star scout brings back 60; a one-star scout, 20.
And the trim is uniformly at random — not "the best N". If 112 players match your criteria, a three-star scout throws 72 of them away at random, and re-running the same search gives you a different list.
So: a £45,000-a-year five-star scout buys you 50% more names off the same search, and nothing else. Whether that is worth £41,000 more than a one-star scout is a real decision, not an obvious one. And re-run the same search — the player you want may simply have been binned by the lottery last time.
Also: searching by ROLE checks all six of a player's positions, not just his first. The E.U. / NON-E.U. boxes only reach foreign clubs; the four division boxes are what reach English ones.
The youth scout scans the pool, filters it, and then returns at most one player, chosen uniformly at random from the matches. Not the best match — a random one. Youth players sit in the game's youth pseudo-club, which is the lowest stature band there is, which is why their listed fees look absurdly low.
They are not buyable at that price. They arrive only through the scout, and they leave the pool only by being promoted — the same scout can never find the same boy twice.
Do this: hire the youth scout in week one. It is the only route into the academy and the searches are the only intake there is.
(VE + RE + AG + CA) >> 2 — the four general bytes, averaged.Outfielders rank on (STR + PASS) / 2. Keepers rank on GKSAVE, which is why so many of them tie on 99 — from HANDLING 89 upward they are the same keeper to the engine. TACKLING, DRIBBLING, HEADING and SHOOTING are not read at all, so they are not ranked on.
feeTable[idx] × 5,000 — the asking price, and what the seller accepts.wageTable[idx] × 5,000, per year.stature × 54 + abilityTier(STR) × 6 + ageTier(age).Both tables are lifted byte-exact out of the original executable. Stature is the selling club's standing 0–12, set from its division and its squad's average strength — which is why the same player is worth ten times more at Liverpool than at Blackpool. Checked against the real TRANSFER MARKET screen: 17 of 17 rows exact.
Loading the database…
Fine roles are the game's own position index — the ROL column, drawn as a pitch glyph — named from the SCOUT screen's own ROLE dropdown. Roles with fewer than 50 players are omitted. The youth pool is included and marked youth; those players are not buyable. They arrive only through the youth scout, and their listed fee is what the table says the youth band is worth, not an asking price you can pay.
Three sources, in order of authority: