Bumped version to 1.5.8 and added readme

This commit is contained in:
Luxferre
2024-01-22 11:36:52 +02:00
parent dc9753a562
commit 9bf5a3eef0
2 changed files with 131 additions and 8 deletions
+123
View File
@@ -0,0 +1,123 @@
awlite: POSIX AWK port of Text Elite
------------------------------------
This is a simple port of Text Elite game engine (version 1.5 written in C
by Ian Bell) to POSIX AWK. It can run on any system that supports current AWK
language standard. Compared to the original TE 1.5, this port also introduces
numerous fixes, optimizations and further gameplay improvements.
== Running the game ==
The overall command for running awlite looks like this:
LC_ALL=C awk -f awlite.awk [-v NO_ALIEN_ITEMS=1] [-v CENSORED=1] [-v CHEAT=1]
You can replace "awk" with "nawk", "busybox awk", "gawk --posix",
"mawk -W posix" etc depending on which AWK implementation you have.
Note that LC_ALL=C environment variable setting is **required** for all
implementations to work correctly and identically, although in practice
nawk and busybox awk might not need it.
Optionally, you can also supply these flags to change some game aspects:
* -v NO_ALIEN_ITEMS=1 forces "Alien Items" goods unavailability in the game;
* -v CENSORED=1 replaces "Slaves", "Narcotics" and "Liquors" goods names;
* -v CHEAT=1 enables "cash" and "sneak" commands in the REPL.
Of course, awlite is fully scriptable, e.g. you can append < script.txt to the
basic game launch command.
== In-game commands ==
As you launch a fresh game, you start on the planet Lave of Galaxy 1,
on a ship with 20t of cargo space, with 100 credits of cash.
From now on, the following commands are available (case-insensitive):
* buy (product) (amount): buy specified amount of specified product
* sell (product) (amount): sell specified amount of specified product
* fuel (amount): buy (amount) lightyears of fuel
* jump (planetname): fly to planetname, deducing fuel accordingly
* galhyp: hyperspace jump to the next galaxy, deducing 5000 credits
(8 galaxies total, you will jump from galaxy 8 back to galaxy 1)
* info [planetname]: print info on planetname, or current system if omitted
(the planet must be in the same galaxy as you)
* mkt: show local planetary system market prices
* local: list planetary systems within 7 lightyears (your max fuel capacity)
* hold: expand your cargo bay to 35t for 400 credits (one-time upgrade only)
* help: display an in-game command help screen
* rand: toggle between the AWK's native PRNG (default) and a custom one
* quit: quit the game
The following commands are only available in cheat mode (-v CHEAT=1):
* cash (number): add (number) to your cash balance
* sneak (planetname): fly to planetname without spending fuel
All commands except "hold", "cash" and "sneak" can be abbreviated by their
first letter. In addition, trade goods names can be abbreviated too (by several
first letters). E.g. "b fo 5" is the same as "buy Food 5", and "q" is "quit".
Fuel price is fixed at 0.2 CR/LY, you can hold 7LY of fuel at most.
== Gameplay differences from the original TE 1.5 C version ==
As of the current version, 1.5.8:
* multiple typos corrected in text strings
* the "cash" and "sneak" commands are only available to the REPL if running with -v CHEAT=1
* galaxy jumps are no longer free and cost 5000 credits each (like in classic Elite and Oolite)
* cargo hold expansion also is non-free (400 credits) and can only be done once from 20t to 35t (like in classic Elite)
* alien items are available by default, can be overridden with -v NO_ALIEN_ITEMS=1
* economy names are no longer shortened
* the "politically correct" goods names are turned on with -v CENSORED=1
* the following goods have been renamed: "Robot Slaves" to "Robots", "Liquor/Wines" to "Liquors", "Gem-Strones" to "Gem-stones"
* market and local info tables are better aligned
To be continued. This list is expected to grow in the future.
== FAQ ==
- Is this a one-to-one port of Bell's Text Elite?
No. Although the original C source code was used as a base, porting was done
by looking at *several* existing ports to understand the logic and basically
rewriting everything in AWK from scratch. Besides the "Goat Soup" description
code strings and trade goods data, no copy-pasting was done whatsoever, and on
top of that, all data had to be converted to use octal and decimal notations
instead of hexadecimal as POSIX AWK does not support hex literals.
- Why do awlite versions start from 1.5.1 then?
Because awlite is versioned in terms of functionality. The direct one-to-one
port would have the same 1.5 version, and every slight improvement adds a new
subversion, i.e. bumps the version number by 0.0.1. Stable subversions tend to
have even numbers, testing subversions tend to have odd numbers. Also, every
new command set implementation bumps the version number by 0.1, indicating that it's no longer fully command-to-command compatible with the previous one.
- How large is awlite?
As of now, the entire game is contained in a single file with a little under
500 SLOC of POSIX AWK code. Future functionality might increase the codebase
size, but one of the goals is to keep it under 1000 SLOC no matter what.
- Why did you keep the cheating commands present in the original?
To preserve backward compatibilty with some trading scripts written for the
original Text Elite versions. Once it is proven the scripts won't work
correctly anyway, the cheat mode will be removed from awlite.
- Why don't the scripts give the same results as for the original TE.EXE?
Even though the internal PRNG is the same, some operations might be compiled
differently. TBH no existing TE ports fully replicate these operations either.
- If Ian Bell ever releases Text Elite 1.6, will the changes be applied here?
Depends on the changes, but this is very unlikely to happen as the most recent
update to the original C code of Text Elite was in 2015.
== Credits ==
Original high-level algorithms from Text Elite 1.5 by Ian Bell, 1999, 2015.
Porting, corrections, improvements and optimizations by Luxferre, 2024.
+8 -8
View File
@@ -1,6 +1,6 @@
# awlite: POSIX AWK port of Text Elite 1.5
# Version 1.5.2
# Original C version by Ian Bell, 1999, 2015
# awlite: POSIX AWK port of Text Elite
# Version 1.5.8
# Original high-level algorithms from Text Elite 1.5 by Ian Bell, 1999, 2015
# Porting, corrections, improvements and optimizations by Luxferre, 2024
#
# Tested on: nawk/one-true-awk, busybox awk, gawk --posix, mawk -W posix
@@ -11,7 +11,7 @@
# - multiple typos corrected in text strings
# - the "cash" and "sneak" commands are only available to the REPL if running with -v CHEAT=1
# - galaxy jumps are no longer free and cost 5000 credits each (like in classic Elite and Oolite)
# - cargo hold expansion also is non-free (400 credits) and can only be done once from 20t to 35t
# - cargo hold expansion also is non-free (400 credits) and can only be done once from 20t to 35t (like in classic Elite)
# - alien items are available by default, can be overridden with -v NO_ALIEN_ITEMS=1
# - economy names are no longer shortened
# - the "politically correct" goods names are turned on with -v CENSORED=1
@@ -509,8 +509,8 @@ function dohelp() {
printf("\nGalhyp (jumps to next galaxy)")
printf("\nInfo planetname (prints info on system)")
printf("\nMkt (shows market prices)")
printf("\nLocal (lists systems within 7 light years)")
if(CHEAT) printf("\nCash number (alters cash - cheating!)")
printf("\nLocal (lists systems within 7 lightyears)")
if(CHEAT) printf("\nCash number (alters cash)")
printf("\nHold (expand cargo bay to %dt)", game["cargoexpsize"])
printf("\nQuit or ^D (exit)")
printf("\nHelp (display this text)")
@@ -614,7 +614,7 @@ BEGIN {
split("", globalseeds) # init galaxy seeds
buildgalaxy(player["galaxynum"], globalseeds) # build the current galaxy
genmarket(0, economies[player["currentplanet"]]) # build local market
printf("\nWelcome to awlite 1.5.2 (based on Text Elite 1.5)\n")
printf("\nWelcome to awlite 1.5.8 (based on Text Elite 1.5)\n")
dohelp()
# start the REPL
printf("\n\nCash: %.1f> ", player["cash"]/10)
@@ -634,7 +634,7 @@ BEGIN {
else if(action == "s" || action == "sell") dosell(paramstr)
else if(action == "j" || action == "jump") dojump(paramstr)
else if(action == "f" || action == "fuel") dofuel(paramstr)
else if(action == "ho" || action == "hold") dohold(game["cargoexpsize"])
else if(action == "hold") dohold(game["cargoexpsize"])
else if(CHEAT && action == "cash") docash(paramstr)
else if(CHEAT && action == "sneak") dosneak(paramstr)
else printf("Unknown command")