OO = "object orientation" isn't so much a "feature" as it is a property of the way the language is designed as a whole.
Example from your code:
define procedure <bounty>
if is <#lastenemy#;Morulan Steamer> then {
do <clonewhip>
do <money1>
}
if is <#lastenemy#;Hooker> then {
do <clonewhip>
move <sabre; #quest.currentroom#>
msg <She dropped a sword on the ground.>
do <money2>
}
if is <#lastenemy#;TOGuard%GuardNo%> then do <cloneDL500>
if is <#lastenemy#;TOGuard%GuardNo%> then do <cloneMaleArmor>
if is <#lastenemy#;TOGuard%GuardNo%> then do <clonebullets>
if is <#lastenemy#;TOGuard%GuardNo%> then do <clonedl500>
if is <#lastenemy#;TOGuard%GuardNo%> then do <money3>
if is <#lastenemy#;TOSoldier%SoldierNo%> then do <cloneSerratedWhip>
if is <#lastenemy#;TOSoldier%SoldierNo%> then do <cloneFemaleArmor>
if is <#lastenemy#;TOSoldier%SoldierNo%> then do <clonebullets>
if is <#lastenemy#;TOSoldier%SoldierNo%> then do <money4>
if is <#lastenemy#;Information Bot> then do <clonelazercannon>
if is <#lastenemy#;Ariana> then do <money1>
if is <#lastenemy#;Purger%PurgerNo%> then do <cloneslicer>
...
On the first level, I'd rewrite this to call a "death drop" message on lastenemy. (My code is given in TADS because I'm more familiar with that language.)
bounty : function (enemy) {
enemy.death_drop;
}
On the root character class, I'd define a fallthrough "death drop" method that did nothing.
On each character / character class, if needed, I'd define an override method.
TO_Soldier_Class : object
death_drop = {
clone_serrated_whip ();
clone_female_armor ();
clone_bullets ();
money4 ();
}
...
This will organize the code better, by putting code related to soldiers together. It will also fix the bug that if TOsoldier 4 exists, TOsoldier3 gives nothing.
On a second level, I'd remove the global variable %EHP% and its onchange method, and replace it with a property 'hp' & method 'damage(amount, attacker)' in the main character class, and move the various 'if enemy = ...' parts to object methods.