• Updated 2023-07-12: Hello, Guest! Welcome back, and be sure to check out this follow-up post about our outage a week or so ago.

Don't Mess With Old Externals in Hermes II 3.5.11!

Hardcore SysOp

Well-known member
Folks, I have a warning for adventurous Hermes II SysOps, however many of you are still out there. Yes, I know that we are a dying -- or already dead? -- breed.

As you will know, most old Hermes II externals broke when Michael Alyn Miller released Hermes II 3.5.11 years ago. I mean, many dozens of externals went right into the trash bin, never to be used again ..... unless one is using an older, buggy version of Hermes.

Well, some folks, like Byte Knight and myself, were kind of desperate to find at least a few old externals which will still work with 3.5.11. Byte Knight found six games. I don't know how many he tried in all.

Myself, over the past few weeks I have tried many dozens of them, and met with failure with every single one of them. They's dead, buddy, they's dead! :)

BUT, I learned an important lesson early this morning. After Byte Knight informed me that he got some externals to work by removing all of the python stuff from Hermes' folders, I decided to try again, hoping for better success a second time around the bend.

Not only did I NOT meet with success, but while in the middle of trying the same bunch of dozens of externals -- I mean a lot of them -- I totally hosed Hermes. Suddenly, I couldn't even launch it. I kept getting some kind of "staging" error in Hermes' terminal window. It would repeat about 18 times.

I tried to do all kinds of stuff to recover, including replacing the Hermes app with a fresh copy, removing certain data files from the Hermes Files folder, etc.

Absolutely NOTHING worked! In the end, I had to start from scratch, and let Hermes recreate its required folders, and then I had to build my BBS from scratch. Thankfully, however, I keep multiple back-ups and records of my settings, my ANSI screen screens, etc. Nevertheless, I still had to recreate my message conferences, my file directories, re-add my ANSI screens, etc. It took me hours.

So my advice is this: If you are using Hermes II 3.5.11, please do NOT mess with any of the old externals, other than the six that Byte Knight got working. Trust me, the hassle I went through is not worth it. One or more of those old externals just REALLY messed up my board.

You have been warned.
 

cloverskull

Well-known member
Yeah, it's a bummer, I wish the compatibility with older externals could be re-implemented because that would really make using Hermes fun :(
 

Hardcore SysOp

Well-known member
Yeah, me too, CloverSkull -- is your skull really green? :)

Until a few weeks ago, Michael Alyn Miller was communicating with me, and I was hoping that he was taking a renewed interest in Hermes II. However, now I am not sure, because he has been dead silent, and has not responded to a single one of my email messages in weeks. So, I really don't know what to think.

HOWEVER, this crazy old guy has decided to take the bull by the horns. What I mean by that is that as I mentioned to Byte Knight, someone needs to take the initiative, and try to learn to create new externals, using Michael's Python/Jython based External Development System.

Thus, even though I am 70 years old, have never learned a programming language in my life, or created any program -- other than one external nine years ago -- I am in fact in the middle of creating a brand new, Hermes II 3.5.11-compatible, Python/Jython-based game.

It has been a REAL struggle for my old, slowing-down mind, but I have made progress, as I will be explaining in a separate post. If I can really pull this off, then I am hoping that some of you young bucks will likewise get inspired, and try your hand at it as well. If you already know Python, you will be miles ahead of me.
 

cloverskull

Well-known member
Cloverskull is from a hat that I had, my teammates in the military adopted the symbol as our logo. We said we were "lucky we ain't dead" lol.

Bummer he stopped communicating with you. I wonder if we were asking too much of him and he got spooked :(

I encourage your adventure creating new externals, but I think as far as some of us are concerned, being able to use the old externals is pretty attractive. I know my way around python well enough but don't see myself writing anything new for this; I'd be much more inclined to contribute to the source of the BBS itself in whatever way necessary to bring back compatibility with older stuff. Problem is, I have no idea where to begin :/

Good luck! YouTube tutorials are your friend!
 

Byte Knight

Well-known member
Until a few weeks ago, Michael Alyn Miller was communicating with me, and I was hoping that he was taking a renewed interest in Hermes II. However, now I am not sure, because he has been dead silent, and has not responded to a single one of my email messages in weeks. So, I really don't know what to think.
Don't feel bad - he ghosted me about a year ago, probably because I was asking too many questions. :oops: However, I've been in contact with the original creator of Hermes, Will Price, and he seems interested in getting back into the swing of things - stay tuned...
It has been a REAL struggle for my old, slowing-down mind, but I have made progress, as I will be explaining in a separate post. If I can really pull this off, then I am hoping that some of you young bucks will likewise get inspired, and try your hand at it as well. If you already know Python, you will be miles ahead of me.
That's fantastic that you're working on a new door! Judging by the lack of interest in Mac BBS'ing in general, I don't think we're gonna get anyone else to create doors. I think with Will's help there may be a possibility of getting the older doors to work with the latest version though.
 

Hardcore SysOp

Well-known member
Bummer he stopped communicating with you. I wonder if we were asking too much of him and he got spooked :(

I encourage your adventure creating new externals, but I think as far as some of us are concerned, being able to use the old externals is pretty attractive. I know my way around python well enough but don't see myself writing anything new for this; I'd be much more inclined to contribute to the source of the BBS itself in whatever way necessary to bring back compatibility with older stuff. Problem is, I have no idea where to begin :/
CloverSkull, it is interesting that you should say that, because I have also considered the possibility that Michael got spooked, and just decided that as much as he loves Hermes II, and hated to see it die, he doesn't want to be drawn back into it, precisely because it is old technology, and he has moved on to newer, more modern things.

Of course, I don't know this for a fact. For all I know, this could be the exact opposite of the truth. He could just as well be working behind the scenes to be making old externals compatible with Hermes II 3.5.11 by rewriting them as Jython modules, or who knows what. But again, this could just be wishful thinking. The simple truth of the matter is that none of us really know what is up with him, because he hasn't communicated with us.

As far as making Hermes II 3.5.11 compatible with older externals, personally, I honestly don't see that happening. If you visit Michael's old Hermes II website -- do so soon, because it has begun to throw security warnings, probably due to an expired certificate -- and see how much hard work he put into explaining his External Development System, so that Hermes SysOps can write their own externals, you will understand why I say this. I mean, he REALLY put a lot of work into it.

So, as far as I know, the ONLY way to use any of the really old externals, is by reverting to a rather old, buggy version of Hermes with all of its inherent problems. Or, do as Byte Knight did, and remove all of the Python/Jython stuff from Hermes' folder hierarchy, so that you can at least use those six compatible externals that he found still work.

In short, the only way to get those old externals to work with 3.5.11, is to convert them from their current Pascal code base to the newer Python/Jython framework, as Michael did with Leech.
 

Hardcore SysOp

Well-known member
Don't feel bad - he ghosted me about a year ago, probably because I was asking too many questions. :oops: However, I've been in contact with the original creator of Hermes, Will Price, and he seems interested in getting back into the swing of things - stay tuned...

That's fantastic that you're working on a new door! Judging by the lack of interest in Mac BBS'ing in general, I don't think we're gonna get anyone else to create doors. I think with Will's help there may be a possibility of getting the older doors to work with the latest version though.
Yeah, I suppose ghosting is a good way to put it. I know that he was quite impressed by the website that I created for my BBS, and he seemed open to communication, and then it just suddenly and unexpectedly dried up, leaving me wondering what happened.

As far as new externals are concerned, I don't know how many of my other posts you have read, but insofar as my new game module is concerned, I am stuck, due to a SecurityException that Jython throws every time I try to get it to open a text file which pertains to a new function in my game. I have scoured the Internet looking for an answer, and spent hours with ChatGPT, all to no avail.

So, the only way for me to move forward would be by ripping out that new aspect of my game, and head in a different direction with it. And even that will be challenging, because I am NOT a Python programmer. All I have been doing is repurposing some of Michael's code, and getting a lot of help from ChatGPT as well.

In fact, I have a new idea regarding ChatGPT which I will be testing out shortly.

If Will Price chooses to become re-involved with Hermes II, that would definitely be great, particularly if he continues development on 3.5.11 and forward. But, at the same time, we all need to be realistic about this.

BTW, you never responded to my query regarding where your BBS is located so that I can add you to my BBS list on my BBS. I believe I left a message on your own board, as well as on my board as well. In fact, I don't even know if you have ever visited my board, because I have no idea what your real name is. Hint, hint. :)
 

Hardcore SysOp

Well-known member
I know my way around python well enough but don't see myself writing anything new for this
Alright, here is your test. ChatGPT insists that the following is code perfect with absolutely no errors. Yet when I try to run it at Hermes' Externals menu, it throws a NameError with the word "True" at line 148 in the main() function where it says "while True".

All of the defs are lined up flush against the left margin of the document, with everything indented below each def as required, using tabs.

Other than the ANSI screens which are found in the menu, strings and text subfolders, all of the text below is found in the main.py document.

So in your opinion, why is my BBS throwing a NameError with "whileTrue"? ChatGPT can't figure it out, and I most certainly don't know.

Oh gosh! Upon posting this, this forum's software removed all of the indents. Also, please note that this is written to be compatible with Python 1.7 and Jython 2.7. So some things may not be what you expect. We had to change about five or six functions ot make them compatible with Python 2.7.

import os
import random

# Function to clear the screen
def clear_screen():
if os.name == 'nt':
os.system('cls')
else:
os.system('clear')

# Function to display ANSI welcome screen
def display_welcome_screen():
clear_screen()
f = open(os.path.join('resources', 'text', 'welcome_screen.txt'), 'r')
try:
print(f.read())
finally:
f.close()
print("Do you wish to enter the game?")

def display_main_menu():
clear_screen()
f = open(os.path.join('resources', 'menu', 'main_menu.txt'), 'r')
try:
print(f.read())
finally:
f.close()
print("Choose an option: ")

# Function to display game instructions
def display_instructions():
clear_screen()
f = open(os.path.join('resources', 'text', 'game_instructions.txt'), 'r')
try:
print(f.read())
finally:
f.close()
raw_input("Press enter to return to the main menu.")

# Function to display top scores
def display_top_scores():
clear_screen()
print("Top Scores:")
# Code to display top scores here
raw_input("Press enter to return to the main menu.")

# Function to play the game
def play_game():
clear_screen()
# List of states with their capitals
states_capitals = {
"Alabama": "Montgomery",
"Alaska": "Juneau",
"Arizona": "Phoenix",
"Arkansas": "Little Rock",
"California": "Sacramento",
"Colorado": "Denver ",
"Connecticut": "Hartford",
"Delaware": "Dover",
"Florida": "Tallahassee ",
"Georgia": "Atlanta",
"Hawaii": "Honolulu",
"Idaho": "Boise",
"Illinois": "Springfield",
"Indiana": "Indianapolis",
"Iowa": "Des Moines",
"Kansas": "Topeka",
"Kentucky": "Frankfort",
"Louisiana": "Baton Rouge",
"Maine": "Augusta",
"Maryland": "Annapolis",
"Massachusetts": "Boston",
"Michigan": "Lansing",
"Minnesota": "Saint Paul",
"Mississippi": "Jackson",
"Missouri": "Jefferson City",
"Montana": "Helena",
"Nebraska": "Lincoln",
"Nevada": "Carson City",
"New Hampshire": "Concord ",
"New Jersey": "Trenton",
"New Mexico": "Santa Fe",
"New York": "Albany",
"North Carolina": "Raleigh",
"North Dakota": "Bismarck",
"Ohio": "Columbus",
"Oklahoma": "Oklahoma City",
"Oregon": "Salem",
"Pennsylvania": "Harrisburg",
"Rhode Island": "Providence",
"South Carolina": "Columbia",
"South Dakota": "Pierre",
"Tennessee": "Nashville",
"Texas": "Austin",
"Utah": "Salt Lake City",
"Vermont": "Montpelier",
"Virginia": "Richmond",
"Washington": "Olympia",
"West Virginia": "Charleston",
"Wisconsin": "Madison",
"Wyoming": "Cheyenne",
"American Samoa": "Pago Pago",
"Guam": "Hagatna",
"Northern Mariana Islands": "Saipan",
"Puerto Rico": "San Juan",
"U.S. Virgin Islands": "Charlotte Amalie",
}
state = random.choice(list(states_capitals.keys()))
capital = states_capitals[state]

print("What is the capital of " + state + "?")
print("A) " + capital)
# Generate random capitals for options B to D
capitals_list = list(states_capitals.values())
options = random.sample(capitals_list, 4)
for i, option in enumerate(options, start=1):
print(chr(65 + i) + ") " + option)

user_choice = raw_input("Enter your choice (A/B/C/D): ").upper()
correct_choice = chr(65 + options.index(capital) + 1)

if user_choice == correct_choice:
print("Correct! You earned 5 points.")
return 5
else:
print("Incorrect! You lost 5 points.")
return -5

# Function to display game credits
def display_credits():
clear_screen()
f = open(os.path.join('resources', 'text', 'game_credits.txt'), 'r')
try:
print(f.read())
finally:
f.close()
raw_input("Press enter to return to the main menu.")

# Function to display list of other players
def display_other_players():
clear_screen()
print("List of Other Players:")
# Code to display other players here
raw_input("Press enter to return to the main menu.")

# Main function
def main():
while True:
display_welcome_screen()
user_input = raw_input().lower()
if user_input == "yes":
while True:
display_main_menu()
choice = raw_input().upper()
if choice == 'C':
display_credits()
elif choice == 'I':
display_instructions()
elif choice == 'L':
display_other_players()
elif choice == 'P':
score = play_game()
# Update player's score here
elif choice == 'Q':
print("Exiting the game. Goodbye!")
return
elif choice == 'T':
display_top_scores()
else:
print("Invalid option. Please try again.")

if __name__ == "__main__":
main()
 

cloverskull

Well-known member
I don't think the True boolean was a keyword that could be used this way previous to Python 2. This is a bit of a wild-ass-guess, but instead of "while True" try doing "while (1)" or "while 1" or some variation thereof. Essentially you just need to create an infinite loop. You could even try something like "while (1=1)" or something to that effect.
 

Hardcore SysOp

Well-known member
Sorry for the late reply, CloverSkull, but I was having Internet troubles the past few days, which were finally resolved this evening.

Anyway, I am happy to report the previous issue has been resolved, and "Name That Capital" is coming along nicely, except for one nagging problem. For some reason, whenever the user types a letter as their response to one of the multiple choice questions, their response is in black text against the BBS's black background, which means that their response cannot be seen.

I don't know what is causing this, and ChatGPT hasn't figured it out either, We have tried a variety of coding solutions, but none of them have worked thus far. There are only so many places where I can insert ANSI color codes into the function, and none of them are working, or are reported by Jython as being invalid syntax.

One we get over this hump, the game will be almost finished, minus adding a List Players function, and a List Top Scores function.
 

Hardcore SysOp

Well-known member
I also wanted to mention to everyone that within the next week, in addiction to Leech 2000 which Michael Alyn Miller included with Hermes II 3.5.11 when he released it years ago, I hope to have five new Jython-based game modules which work with 3.5.11. These will be:

1. ChatGPT Checkers
2. KJV Bible Quiz
3. Name That Capital!
4. Space Race: Mission to Mars!
5. Tic-Tac-Toe

So that will be six games working in 3.5.11, and I don't intend to stop there. I wish more of you would get on board and try your hand at this, instead of looking backwards at older versions of Hermes and older externals.
 
Top