Triumph & Tragedy: Bronze Age to Late Antiquity

ThichN

Warlord
Joined
Aug 15, 2022
Messages
299
This thread is to be a general discussion (and soon launch) of Triumph & Tragedy, a mod for Civ2 ToTPP that I have been working on.

I realized very quickly that some of the lofty goals for another project I had could not be accomplished without practice (Lua, I’m looking at you!). So, I did what any good-natured Civ fanatic would do, and turned to what has always been my favorite era of a Civ game: the ancient era.

Inspired by @Fairline 's amazing art, @Knighttime 's MedievalMillennium mod, and the general capabilities of Lua / @Prof. Garfield 's amazing work therein, I’ve been diligently chiseling away at this project. Also: @CurtSibling 's great ancient city graphics, and @Catfish 's terrain! (I made some small additions/tweaks, including creating a cliff-like look for the coast. :))

What it is

This mod will simulate, in general, a Mediterranean/Ancient Near East-like world moving from the bronze age to late antiquity (~1800 BCE to ~500 CE). The preferred game mode is a new game, with a custom-made map, though (I think) a player could certainly load a pre-made map, though it might throw off balance. I would not recommend it, though, as the concept of exploring a new map is of great importance to the player.

Distilling such a varied and epic era into its essentials was/is no easy task. Liberties have been taken, generalizations applied. I hope these balance with some of the details I’ve put into the overall experience. I'd say the game is fairly similar to the base game in operation, but with several added choices and consequences. Civs include a variety of civilizations or peoples that occupied those regions during the entire time. I tried to put them into similar categories (i.e., you'd never have the Parthians and the Achaemenids in the same game).

Here are some nutshell features that are operating correctly (some light spoilers, FYI):
  • “Tribes” which generate throughout the game. These can be negotiated with by Envoy units early on, and later on, most high-end military units can attack and remove them forcibly. Using an Envoy, however, results in a list of choices that the player can do related to that tribe type. There are 3 tribe types: builders, merchants, and mercenaries.
  • Special events that create choices for the player, which depend on the game year, tech acquired, etc. Events range from disasters to religious, and can impact a range of game stats as you go. Some are based on decisions you made previously, others random, and a lot of the choices/results also change depending on circumstances (aiming for high replayability).
  • Special units that have been Lua-ed (e.g., shepherds that provide extra food to cities, different types of generals, priests)
  • Late game ability to “urbanize” certain tiles
  • Various unique units that can only be obtained through choices you make
Some minor things to do before an alpha launch:
  • Fix a few details noticed during my last test playthru
  • Change civ colors
This has sort of been a bottomless pit for me, so I need to stop and release alpha on the soon-ish side. I aim to introduce more features as I develop, though. Hoping to put a release here as early as 2 weeks from now!

Some screenshots below.

city screen.png

I made a new city screen for this mod.

priests.png

What would you do?


1.png

Approaching Gordian...

3.png

A Spartan fleet is on the move.

4.png

The Babylonians are having issues.


5.png

A long trading road through the desert, connecting Parthian settlements.
 
Quite looking forward to it! Wonderful to see a new release from a new designer!
 
Thank you, @techumseh , @JPetroski , and @CurtSibling ! Much appreciated. I hope to get an alpha version posted sometime by the weekend so folks can try it out!

Thanks as well for the graphic tips, Curt. Those are also great. I gravitated by your ancient cities work (I like them, by the way!) because they show several different architectural styles that cover the vast scope of territory represented in this mod. But these ones you posted would be great for modern-era cities! Any chance of you updating your ancient cities? ;)
 
(BTW, @CurtSibling , I realize what I said above was probably confusing: by "modern" I meant in terms of my game, so late antiquity-ish. :))

Still chiseling away at this project. I keep finding little fixes. Good to do this now, though I'm likely overthinking it. Played a fun test game as the Macedonians on a small map with mostly land. Conquered a few Scythian settlements, the Hittites to the east (not pictured), and the Aksumites to the west (not pictured). Some uprisings have occurred. More to come!

MacedonianSpread.png
 
Triumph and Tragedy v1.0a is now live!
Click here to be taken to the download page.

title.gif

No man ever steps in the same river twice, for it's not the same river and he's not the same man.
- Heraclitus​


This mod weighs over 200mb. From the Civfanatics download page, you'll be taken to an external Google Drive download.

I am open to any feedback, suggestions, bug reports, etc.! Also, always love after action reports or progress posts, if anyone feels the drive. :egypt:

Many, many thanks to: @Prof. Garfield @Knighttime @Fairline @CurtSibling @Catfish @JPetroski and so many others for their help so far. What may seem like small things to you have really propelled this forward and encouraged me to see it through. This community is great! I should note, too, that I'm the kind of person who never considers something finished. I kept tinkering and adding, but finally got to a place I felt satisfied. Do let me know of any changes you'd like to see, fixes, etc.
 
Pretty major fix added, that corrects issues with the Bronze Age Collapse event (some content not moved into the right lua file; apologies if anyone got to this stage!). Let me know if anything else comes up in playtesting.

Download newest version @ the Civfanatics download page.
 
I know this is in alpha playtesting, but embarrassed to say I found another lua mistake! Forgot to include some of the functions that identify images in the onCityProcessingComplete.lua. Fixed now!

An issue coming up is that one civ in my current playthru is not having their Hero unit retiring. Puzzling, and had not happened in other playthrus. Will continue to look into this.
 
Hi ThichN,

I've finally had the opportunity to download your mod and have been playing it for the last few days.

I have to say I'm quite impressed not only by the features you've managed to implement (no spoilers here :) ) but just the general overall quality of your design and components (the images used are just beautiful). Is this your very first attempt at mod creation?

I did start playing with version one when when I realized you had done an update, which I did download.

I did run across this bug that I thought I should report :

Code:
... II Test of Time\Original_Two\LuaCore\generalLibrary.lua:3831:
The variable name 'city' doesn't match any available local variables.
Consider the following possibilities:
Is 'city' misspelled?
Was 'city' misspelled on the line where it was defined?
(That is, was 'local city' misspelled?)
Was 'local city' defined inside a lower level code block?
For example:
if x > 3 then
    local city = 3
else
    local city = x
end
print(city)
If so, define 'city' before the code block:
local city = nil -- add this line
if x > 3 then
    city = 3 -- remove local from this line
else
    city = x -- remove local from this line
end
print(city)
If you really did mean to access a global variable, write:
_global.city
If you are trying to work in the console, use the command:
console.restoreGlobal()
to restore access to global variables (locals don't work well in the console)
stack traceback:
    [C]: in function 'error'
    ... II Test of Time\Original_Two\LuaCore\generalLibrary.lua:3831: in metamethod '__index'
    ...184\Civilization II Test of Time\Original_Two\events.lua:1915: in field '?'
    ...of Time\Original_Two\LuaCore\discreteEventsRegistrar.lua:235: in field 'performOnCityProcessingComplete'
    ...184\Civilization II Test of Time\Original_Two\events.lua:554: in function <...184\Civilization II Test of Time\Original_Two\events.lua:548>
 
The relevant section of code, and its fix, is in spoilers, since it reveals an event:
Spoiler :

events.lua, around line 1915:
Code:
local function randomTileNearCurrentTribeCity()
    local city = chooseCurrentTribeCity()
    if city then
        return randomCityRadiusTile(city)
    end
    return nil -- in case no human cities on map
end

local servileWarImage = civ.ui.loadImage("Images/servilewar.bmp")
discreteEvents.onCityProcessingComplete(function(turn,tribe)
    if tribe:hasTech(techAliases.BloodSport) and (tribe:hasTech(techAliases.Manumission) == false and math.random() < 0.05) then
        if tribe.isHuman then
        local city = chooseCurrentTribeCity()
        local dialog = civ.ui.createDialog()
                dialog.title = "Gladiator Rebellion!"
                dialog.width = 500
                dialog:addImage(servileWarImage)
                local multiLineText = "A gladiator, disgruntled by his treatment at the hands of his oppressors, has risen up near "..city.name.."!\n^\n^We must eliminate this threat. The longer he survives, the more followers he will attract.\n^\n^^'The fall of dropping water,\n^^wears away the Stone.'\n^\n^- Lucretius"
                text.addMultiLineTextToDialog(multiLineText,dialog)
                dialog:show()
                civ.playSound("SwordShield.wav")
        end
        local gladiatorRevoltLocation = randomTileNearCurrentTribeCity(city)
        local createdUnits = gen.createUnit(unitAliases.Gladiator,civ.getTribe(0),gladiatorRevoltLocation,{count = 1, randomize = true, scatter = true, inCapital = false, veteran = true, homeCity = nil, overrideCanEnter = false, overrideDomain = false, overrideDefender = false})
        if createdUnits[1] then
            unitData.counterSetValue(createdUnits[1],"unitRetirementTurn",civ.getTurn()+20)
        end
    end
end)
First, make the following change to randomTileNearCurrentTribeCity
Code:
local function randomTileNearCurrentTribeCity(city)
    city = city or chooseCurrentTribeCity()
    if city then
        return randomCityRadiusTile(city)
    end
    return nil -- in case no human cities on map
end

The line
Code:
    city = city or chooseCurrentTribeCity()
Means that if no argument is provided to the function, the city variable will be nil, so 'or' will evaluate chooseCurrentTribeCity() and the resulting value will be assigned to city.

However, if city is not false/nil, it will keep its current value. This is a way to assign default values for function parameters.
Then, move these two lines
Code:
local city = chooseCurrentTribeCity()
local gladiatorRevoltLocation = randomTileNearCurrentTribeCity(city)
before
Code:
if tribe.isHuman then

I think that will fix the problem.
 
I am open to any feedback, suggestions, bug reports, etc.! Also, always love after action reports or progress posts, if anyone feels the drive. :egypt:
Hi @ThichN, thanks for creating this mod! I downloaded it a couple weeks ago and have been playing on-and-off as I find the time. So far I'm up to 750 BC and appear to be in first place ("Supreme" power rating) although that's due to the fact that I chose to play my first game on the second-easiest level, not because I've displayed any exceptional skill! I thought I'd give myself an easier road and make this playthrough more of a chance to get acquainted with the new concepts. I have 11 cities and 2 wonders (Hanging Gardens and Sargon's Stele) so far.

Overall the graphics are very well-done, and I'm especially enjoying the images and quotes that appear in popup messages (as well as graphics and units on the main game board). If I had to make one suggestion in this regard, it would be that the trees used on forest tiles are exactly the same style as those used on hills, which is most apparent for a single-tile forest (not adjacent to another forest tile). Much of the map in my territory consists of patchy hills and forest, and I find it difficult to tell them apart without clicking on each tile and looking at the status pane.

Would you mind sharing what the actual percentage chance is for the Shepherd and the Ranger to send food/shields back to the closest city? I chose a Shepherd in my game but ended up using him as an Explorer, until he was killed by an enemy. I like the idea of these units, but I wonder if there's a way to make them more impactful? Or maybe my Shepherd was sufficiently impactful but I missed the "subtle bird chirp" and didn't realize it? Also I wish it was possible to build more of them or receive them at other points in the game, although I recognize there would need to be limits around this to preserve game balance.

An issue coming up is that one civ in my current playthru is not having their Hero unit retiring. Puzzling, and had not happened in other playthrus. Will continue to look into this.
This is definitely true for me -- my Hero never retired. But I also struggled to understand how to use him effectively.
Spoiler :
After reading the message that appeared when he did, my intention was to use him as an adventurer, rather than a warrior, and therefore I sent him out to explore sea tiles especially on the edges of the map. But I never found anything interesting at all, so eventually he ended up being another super-powered Explorer. I did occasionally see message popups that sounded like Hero units from other nations were having more success, like killing a minotaur. Was I just unlucky?
Perhaps a little more documentation in the Readme about this unit would be helpful -- some text appeared onscreen when my Hero appeared, but there's no way to go back later and re-read that to see if there were some tips or instructions that I missed. Overall I think this is another great concept and I think it could add a lot to the game, it just didn't work out for me like I hoped.

One last thing: I'd encourage you to go through some of the unit stats and costs and consider how they overlap. I suppose the order in which I chose to research techs has some bearing on which units are available simultaneously vs. at different times, so others' experiences may vary, but I noticed:
  • Bows are 3a/1d/1m, 1h/1f and Chariots are 3a/1d/2m, 1h/1f but both cost 40 shields -- so if they're both available at the same time, I'll never build Bows. Should the Chariot be more expensive, or Bows cheaper? Or should Bows become obsolete at an earlier point?
  • Light Inf. are 3a/2d/1m, 1h/1f and Horse Archers are 4a/2d/2m, 1h/1f but both cost 60 shields. With two advantages on the side of the Horse Archers, it definitely feels like there ought to be a cost difference here.
  • The Garrison unit is 1a/3d/1m, 2h/1f with +50% defense vs. horse -- an excellent early-game defender. But at a relatively early point, it apparently became obsolete and stopped appearing as a build option, with nothing obvious that can replace it (until Hoplites, but even those only have 1 HP plus they cost more). At the point when I realized they were no longer appearing as an option, one of my cities was still building a Garrison, so when it completed, I just made sure I didn't click Change to open the city build queue, and let that one city keep churning out Garrisons forever. I'm guessing that's not supposed to be allowed? :) So you might want to take a look at using Lua to prevent this exploit -- but also I'm wondering why this unit becomes obsolete when it does. Or is this an example of the "Unit Population Limits" you mentioned in the Readme?
I hope none of this feedback is discouraging to you -- that's certainly not my intention! I'm only raising these issues because you made it clear this was an "alpha" release and that you were looking for feedback from the community to help you identify any areas worth improving as part of the final version. Overall, I want to emphasize that there's a lot to like about this scenario, and that this is definitely impressive given that it's apparently the first project you've released. Congratulations and keep up the good work!
 
An issue coming up is that one civ in my current playthru is not having their Hero unit retiring.
You have a lot of code checking if units should retire, and, evidently, they are all within some if statement or something. Here's my advice: Use one specific event for retirement:
Code:
discreteEvents.onCityProcessingComplete(function(turn,tribe)
    -- unit retirement
    for unit in civ.iterateUnits() do
        if unit.owner == tribe and unitData.counterGetValue(unit,"unitRetirementTurn") <= turn then
            if unit.owner.isHuman then
                civ.ui.text("After years of service, your "..unit.type.name.." has retired.")
            end
            gen.killUnit(unit)
        end
    end
end)
If you want to have different messages for different kinds of unit types retiring, use if statements within this event.
 
Thank you for such encouraging comments and feedback! Here are my responses to all.

tootall_2012 said:
I have to say I'm quite impressed not only by the features you've managed to implement (no spoilers here :) ) but just the general overall quality of your design and components (the images used are just beautiful). Is this your very first attempt at mod creation?

Thank you! That means a great deal coming from you. This is my first real attempt. I have tinkered and played with stuff, going back to when Civ2 FW was released. But nothing ever solid until now. I felt the itch!

tootall_2012 said:
I did run across this bug that I thought I should report :

Thank you for reporting this! And thank you @Prof. Garfield for the fix. I came across this, as well. I think it came from when I separated my main events.lua file into multiple files. I missed some code and steps in doing so. But because they are separated, easier to find and repair! :)

Knighttime said:
Overall the graphics are very well-done, and I'm especially enjoying the images and quotes that appear in popup messages (as well as graphics and units on the main game board). If I had to make one suggestion in this regard, it would be that the trees used on forest tiles are exactly the same style as those used on hills, which is most apparent for a single-tile forest (not adjacent to another forest tile). Much of the map in my territory consists of patchy hills and forest, and I find it difficult to tell them apart without clicking on each tile and looking at the status pane.

This is a great suggestion. I was a bit concerned about this, too. I will think of better ways to show those features. I was trying to go for a more "blended" look with the landscape, but when playing a strategy game, clarity is best. Thank you for mentioning this.

Knighttime said:
Would you mind sharing what the actual percentage chance is for the Shepherd and the Ranger to send food/shields back to the closest city? I chose a Shepherd in my game but ended up using him as an Explorer, until he was killed by an enemy. I like the idea of these units, but I wonder if there's a way to make them more impactful? Or maybe my Shepherd was sufficiently impactful but I missed the "subtle bird chirp" and didn't realize it? Also I wish it was possible to build more of them or receive them at other points in the game, although I recognize there would need to be limits around this to preserve game balance.

Sure -- I have it coded in at 25% of the time. The bird chirp might be easy to miss with the soundtrack. You can indeed build more of them! And the woodsman, too. The Shepherd requires "Standardized Rites" tech and the Woodsman requires "Medicine" tech. They might have population limits, too... I can't remember. Worth implementing if not.

But yes! You need to really protect that first one you get, as it is the only for a while.

Knighttime said:
This is definitely true for me -- my Hero never retired. But I also struggled to understand how to use him effectively.

Thanks to @Prof. Garfield 's advice I was able to correct all of the retirement issues, and will upload a new version with this. Spoiler below on how to use the Hero effectively!

Spoiler :
You can use the Hero to conquer, yes, but also to traverse the sea. This is not telegraphed in the game, but moving the hero in ocean terrain has a chance of accumulating more science "beakers" -- and so can speed up research. Perhaps I need a subtle sound as with the Shepherd/Woodsman? Also, when the Hero generates, 3 mythical creatures also generate, and you must find them. Consider it a scavenger hunt. One of them is not in the sea, though... If you want me to tell you more, I'm happy to. :) Just know that, depending on which mythical creature(s) you defeat, something will happen later when you research Epic Poetry (you'll have some decisions to make). Meanwhile, using the Hero to conquer is its own reward.


Knighttime said:
Perhaps a little more documentation in the Readme about this unit would be helpful -- some text appeared onscreen when my Hero appeared, but there's no way to go back later and re-read that to see if there were some tips or instructions that I missed. Overall I think this is another great concept and I think it could add a lot to the game, it just didn't work out for me like I hoped.

Noted! I'll make sure to better explain the Hero without spoiling too much. This is good to know.

Knighttime said:
Bows are 3a/1d/1m, 1h/1f and Chariots are 3a/1d/2m, 1h/1f but both cost 40 shields -- so if they're both available at the same time, I'll never build Bows. Should the Chariot be more expensive, or Bows cheaper? Or should Bows become obsolete at an earlier point?

Thanks for pointing this out! I should definitely revise. I think I had considered the Chariots are mounted, and so deal with the baggage of being a "horse" unit, but have fast movement, where the Bows do not. But still, I think that bows should be cheaper.

Knighttime said:
Light Inf. are 3a/2d/1m, 1h/1f and Horse Archers are 4a/2d/2m, 1h/1f but both cost 60 shields. With two advantages on the side of the Horse Archers, it definitely feels like there ought to be a cost difference here.

This is a big oversight! I'll need to adjust this. The Horse Archers should definitely be more expensive.

Knighttime said:
The Garrison unit is 1a/3d/1m, 2h/1f with +50% defense vs. horse -- an excellent early-game defender. But at a relatively early point, it apparently became obsolete and stopped appearing as a build option, with nothing obvious that can replace it (until Hoplites, but even those only have 1 HP plus they cost more). At the point when I realized they were no longer appearing as an option, one of my cities was still building a Garrison, so when it completed, I just made sure I didn't click Change to open the city build queue, and let that one city keep churning out Garrisons forever. I'm guessing that's not supposed to be allowed? :) So you might want to take a look at using Lua to prevent this exploit -- but also I'm wondering why this unit becomes obsolete when it does. Or is this an example of the "Unit Population Limits" you mentioned in the Readme?

Yes, this is an issue. I haven't yet found an elegant way to prevent cities from building capped units if they are already in the queue (though the AI does follow the rule, to my knowledge?). But you're right: the Garrison unit, because it is so strong, is population capped. You can only build so many depending on your population. They're great to place in Forts and obviously in cities. Maybe I'll make the Hoplite cost an equivalent amount or look at those costs, too.

Knighttime said:
I hope none of this feedback is discouraging to you -- that's certainly not my intention! I'm only raising these issues because you made it clear this was an "alpha" release and that you were looking for feedback from the community to help you identify any areas worth improving as part of the final version. Overall, I want to emphasize that there's a lot to like about this scenario, and that this is definitely impressive given that it's apparently the first project you've released. Congratulations and keep up the good work!

Oh, not at all! On the contrary, I feel very happy that folks are trying this out and taking time to offer feedback at all. It is very generous of you and @tootall_2012 , and extremely helpful moving forward as I inch towards a 2nd version. Feedback always welcome, even in a slightly more polished version. :)

Thank you both again, and Prof. for his above fixes. I've actually adjusted a few things in the last couple days, and will be posting an update sometime very soon! Do let me know if there are other notes to make, or if you have any feedback / comments on the above, tips, etc.
 
... This is my first real attempt. I have tinkered and played with stuff, going back to when Civ2 FW was released. But nothing ever solid until now. I felt the itch!
As I may have mentioned in the past, I have a personal preference for historical scenarios, not only for playing but as part of my own creations. But every now and then a project comes along that makes me want to take a closer look simply based on the quality of its design and concepts.

As I'm still playing, I had a couple of other observations:

I love the urbanization feature though the fact that you can't navigate to the different city locations once the popup appears makes it difficult to properly determine which city or tile you would want to select. Perhaps you could give a popup saying that the player has the option to add an urban tile, and then provide a different screen to make their final selection once they've made their decision?

Urban growth.png


The same is true for the placement of fortress tiles.

Recently, I'm on turn C.E. 35, I've been getting messages that I failed to retake certain cities, even though they were never mine to begin with. Is there some kind of background penalty occuring that the player is not being made aware off (or rather should I be getting these messages at all if there not my cities)?

FailedRetakeCity.png


Of course, as you indicated, this is still an alpha version, but there may be some events which would require a little more detail in a final ReadMe file, or within the game messages themselves?
 
Last edited:
Top Bottom