We’re in the process of publishing the new beta right now.
WHAT WE ARE LOOKING FOR:
- Compatibility. Does the game run on your computer. If not, what problems are you experiencing.
- Game mechanics. We’ll be making a series of journals where we will be putting up topics to discuss. The beta serves as a reference for users.
PLEASE MAKE SURE YOU READ:
NOTES ON THIS BUILD:
- It is VERY buggy, as in, crashes a lot.
- It has memory leaks still so it will eventually crash.
- The AI, while better, is riding the death train (i.e. streams individual units at your cities uselessly).
- It’s not balanced at all which makes it particularly not fun.
NEXT STEPS:
- There WILL be a beta 1G update next Thursday at which time users who have already pre-ordered will be given access to the beta. This next build will focus exclusively on memory use and stability.
- We will, starting tomorrow, have a series of Journal Entries that deal with game areas that we would like to discuss with you to implement between Beta 1G and Beta 2.
Good luck! I’d say have fun but that’s not gonna happen. I want to again reiterate here: Beta 1 is NOT fun. Will NOT be fun. If you find it fun, you should probably seek medical attention.
------------------------------------------------------------------
----------------------- Beta 1G Change Log -----------------------
------------------------------------------------------------------
------------------------
--- MAJOR FEATURES ---
------------------------
**********
* Dynasties *
Overview:
The player can now get married (currently happens randomly) and have children (again, totally random). After 20 turns the children will 'come of age' and become champion units on the map. At this time, the "Arrange Marrage" option becomes available in diplomacy. Daughters will get married into the other faction (you lose her as a unit), but 2 of every 3 children will return to your faction when they grow up.
Details:
+ Added initial dynasty data stuff
- Players keep track of their family tree
- Sovereigns have a random chance to get married
- Married females have a random chance to give birth to a male or female child
- Children "grow up" after 20 turns
- Everything saves/loads
+ Added some basic dynasty debug info to the kingdom report wnd until the real dynasty screen is implemented
+ Fixed some missing ref releases
+ Message boxes release their message data on close so that they don't hold refs to data that they don't need and postpone destruction of the data
+ Fixed gender randomization for children
+ When a child in a dynasty grows up, they now clone whichever of their parents actually exists and are stationed in the first city built by the player
+ Started adding stuff for creating a new unit type and saving/loading it out, basically just an extension of what the AI is already doing when designing their units
+ When children grow up, they now create a separate unit type (though it's still just a clone of their parent's),
and can save/load its info
+ Started hooking up the dynasty wnd, added the dxpacks and some of the classes to the project
+ Added debug messages and asserts to code for making a child grow up, hopefully replacing the crash that Anthony got with an assert and some helpful info instead. If anyone hits the assert, please let me know so I can figure out what the deal is.
+ Added wedding rings picture to marriage message
+ Changed and moved some temp hardcoded strings to the string file
+ Added null pointer check to CUnitType copy cto
+ Fixed crash when a child grows up after their parents have died/don't exist
+ Implemented being able to arrange marriages through the diplomacy screen
+ Fixed some issues with marriage that popped up once this could be done
+ Added report items for births, marriages, and growing up in kingdoms you know about
+ Unhide now calls UpdateControls on the family tree subwnd, if it's shown
+ Added member variables m_pDummyListgrid and m_aStatsEntryWnds
+ Added private helpers FillInfoCardForSelected, CreateStatsEntries, FillStatsArea, and ClearStatsArea
+ Fixed a bug with the type of m_pUnitRelationsListbox
+ Implemented pretty much every part of this screen except for the family tree graphic, which has been temporarily replaced by a selectable list of all the family members
+ Also, all of the list grids are messed up, counting the number of visible entries incorrectly. I think I tracked down where the bug is here, but I wanted to check with other people before I went messing with the code. Once the list grid is counting the entries correctly, though, I checked that the data is all fine, so it should show up correctly after that.
+ Changed stuff to not be the children of cut scene windows, because that totally messes with the resizing of everything
+ Added some dummy controls to act as parents of the controls that were orphaned because of this cut scene window thing
+ Added a temporary list box to the area where the family tree will be displayed, so that functionality could be coded in without the graphic
being implemented yet
+ Added member variable m_pDynastyMember
+ Added AddParentRelation, AddSpouseRelation, and AddChildRelation
+ Added temporary functions SetDynastyMember and GetDynastyMember, which are just being used to flesh out the functionality of the dynasty wnd until the fancy family tree graphic is implemented
+ Implemented the core functionality of the dynasty screen
- However, it is missing the family tree graphic, and instead is using a temporary list grid of all of the members of the sovereign's family that you can click on to get the info for
- Also, I've run into a bug with the list grids where it is positioning the entries incorrectly. I think I know what is causing it, but I want to ask Cari/Jesse before I change any code to try to fix it. After that's fixed, though, the relations info and stats info should stop being positioned funny, and I've verified that the (invisible/poorly placed) data is correct
+ Added global function CreateRandomizedUnitType, which takes a unit type name and pointers to some unit type suggestions and generates a new unit
type out of it, adding it to the global vector of unit types but not saving it to xml or anything
+ However, it's not implemented yet, and just clones the first unit type suggestion for now
+ Fixed size and placement of dynasty screen list grids so that they display correctly
+ Children that have had a marriage arranged are listed as "betrothed" instead of "married" in the dynasty screen
+ Added missing images to various dynasty popups and report entries
+ Fixed some string/image mixups in the report entries
+ Fixed dynasty screen cutscene to display selected unit correctly, with animation
+ Created a new global function CreateRandomizedUnitType, which takes unit type suggestions and makes a new one out of it, adding it to the global
vector of unit types but otherwise not saving it anywhere else. It's not fully implemented, though, and just creates a clone of the first unit
suggestion passed in instead.
+ Slightly changed how stat calculation for units is done to support random unit types better
- Basically made two functions for setting a unit's level: SetLevel and GrowLevel. SetLevel should be called when initially creating a unit, as it looks in the level milestone info to get the stats that that unit should have. GrowLevel should be used on units that already exist and have a level, and it will grow the unit level by 1 and increase each stat by some percentage of the current value instead of looking in the level milestones again. Therefore, level milestones are useful for setting the stats of units that you create at arbitrary levels, but once a unit is created, they follow a different stat growth path.
- Because of this change, unit types created on the fly only need to set their stats when they are created, and don't need to worry about generating multiple level milestones to use as a path for ability growth.
+ Implemented more of the CUnitType function for creating a random unit type
- Randomizes unit stats
- Psuedo-randomizes equipment; basically, for each equipment slot, there is a chance of either equipping the item equipped in that slot by the suggested unit type passed in, equipping nothing, or equpping a completely random piece of equipment that fits in that slot and that the player satisfies the prereqs for.
+ Added line of succession information to the dynasty screen
+ Displayed where the quote for the unit is supposed to go, because I couldn't find a better place for it yet
+ Says how far away they are from the throne, or "King/Queen" if they are the current rulers
+ The succession order updates when people die, leave, or get added to the dynasty
+ Family members displayed in roughly oldest->youngest order in the dynasty screen list box, aka a breadth-first traversal of the family tree
that will eventually be displayed there
+ Implemented saving/loading of all the info in CUnitType in the game save file, for saving child unit types/NPCs
+ This fixes a bug in child unit types where they would get the wrong equipment on load
+ Added short display names for all the unit stats (e.g. Attack = ATK) for places where UI string length is cramped, like the dynasty screen
+ Randomized female unit types no longer get beards and will always equip one of the robes
+ Added a "capital city" for each player, which for now is just the first city built by that player
+ Fixed bug where setting the level of a champion unit didn't refresh all of the stats
********
* Quests *
Overview:
Throughout the course of the game, you'll be presented with the option to help the people of the land by embarking on Quests. Quests may trigger when a unit his a tile on the map, when your kingdom hits a given stat, or randomly.
Details:
+ This check-in introduces the initial (extremely basic) version of the quest system. Each player (both human and AI) has a Quest Manager (the class CQuestManager), which tracks all of their pending, active, completed and failed quests. Currently, active quests are updated every turn to see if they’ve been completed. Quest data is read in from XML from the Game\Data\English\Core Quests directory. The quest data structures are unfinished, but currently consist of a QuestDef, which contains the quest name, description, and trigger information. It also contains a number of QuestObjectiveDefs, which define the conditions that need to be met for the quest to succeed or fail.
+ Added a very simple test quest, “Damsel in Distress”, defined in QuestCityPop.xml, located in the Core Quests directory. When your kingdom hits a total population of 40, the quest dialogue pops up, tasking you with clearing out a swamp bandit goodie hut, which will appear in close proximity to your first city. When it is cleared out, the quest is completed, and a dialogue will pop up congratulating you.
+ Quests are now entirely event- and data-driven. Quests are only updated when specific events occur that may affect them (such as the population of a city changing, a monster being slain, or a goodie hut being cleared), which allows them to respond to changes immediately, without requiring constant condition checking.
+ Added world events for faction population change, and for a goodie hut being cleared.
+ The quest prompt now allows you to decline a quest.
+ Added a flag to CGoodieHut that identifies if it is the target of a quest. To access it, call CGoodieHut::GetIsQuestTarget( ). If the flag is set to TRUE, the goodie hut will not spawn a reward when cleared (as the quest itself will bestow any rewards we may want to give).
+ Added the ability for the quest system to support “fetch quests”, and updated the test quest “Damsel in Distress” so that it spawns a “damsel” item in your inventory, which then must be returned to your capital city to complete the quest. This also shows off the ability for the quest system to support multi-objective quests. As each objective activates, a dialog pops up to inform you what you need to do to complete it.
+ Added an event for when a unit enters a city.
+ Quests can now give gold as a reward for completing them successfully. The “Damsel in Distress” quest has been modified to give 500 gold on completion.
+ Added a new type of Game Object: Quest Locations. Similar to goodie huts, quest locations are placed on the map when you research certain technologies in the Adventure technology path (currently, researching Ruin Delving causes a small number of them to spawn around your capital). They are only visible and useable to a single player (though the functionality to allow any number of players to see a quest location exists). When a quest location is visited, it spawns a random quest, if one is available (currently only the test “Rats in the Basement” quest is set to trigger when a quest location is visited, and it is not flagged as repeatable, so only the first quest location visited will trigger a quest). At the moment, there is only one type of quest location, defined in Game\Data\English\Core Quests\CoreQuestLocations.xml, and it appears on the map with the kingdom inn cloth map icon and tile design as a placeholder.
+ Updated the Kingdom Report window with tabs to switch between the main view and the quest journal, which shows all the quest information for the player (and other players, if in debug mode).
+ Quests can now be flagged as repeatable if we want them to be able to appear more than once during the course of a game. They default to not repeatable, which means they may trigger once per player, per game.
+ Quest items can no longer be consumed or equipped.
+ Added a (very basic) Rats in the Basement quest that can be triggered by visiting a quest location.
+ Added events for visiting a quest location and unlocking a technology.
+ Expanded on the “Rats in the Basement” quest (renamed it to “Rats in the Ruins” to fit in better with the text I banged out for it, naturally we can always change this). It now has you clearing out a Rat Nest goodie hut, which results in you getting a “Dead Rat” quest item, and taking a few points of damage (scratches from the rats). You then have to return the Dead Rat to the Inn you received the quest from, which completes the quest, giving you a reward of 500 gold.
+ QuestDefs and QuestConditionDefs can now be assigned an arbitrary number of GameModifiers, which are applied upon completion of the quest/condition. Both test quests currently in the game, “Damsel in Distress” and “Rats in the Ruins” use them to give quest items, rewards, and (in the case of the rats) penalties.
+ Quest locations now remain on the map after being visited, and can be used in the quest itself (for example, the “Rats in the Ruins” quest has the player returning Inn quest location from which it is spawned as the final objective).
+ Quest data is now saved and loaded properly, and the save game version has been incremented (now at 11) to invalidate old save files.
+ Added a new event for when a unit is killed.
+ Added new quest condition trackers for killing units and building improvements, which allows those actions to be incorporated
into quest objectives.
+ Added an event for when a unit reaches a new level.
+ Quest can now be triggered by a unit reaching a specified level. A unit reaching a level can also be used as a quest condition.
+ Cleaned up the CQuestManager code to make it more modular, and easier to implement new quest triggers.
+ Added a Player game modifier that will spawn Quest Locations for that player, called SpawnQuestLocations. To use it, set the string value (StrVal) to the type of quest location you want to spawn (currently there is only one: QuestLocationTest), set Count to the number of locations you want, set Value to how much you want the number of locations to vary by (for example, if you set Count to 5 and Value to 3, between 2 and 8 quest locations will be spawned), and Radius to how far away from a city the location can appear (this functions as the maximum range; the minimum range is currently hard-coded to 4, and if Range is less than or equal to that, it is automatically bumped up to 5). Each quest location is spawned within the given radius of a random city owned by the player, so that they are distributed throughout your territory. Currently, a SpawnQuestLocations game modifier has been assigned to the Ruin Delving technology (Ruin_Delving_Altar, to be precise), so that when that technology is unlocked, 4 to 6 quest locations are spawned on the map.
******************************
* Faction and Sovereign Customization *
Overview:
Players now pick their sovereign and faction at the start of the game, or have the choice of creating their own. Saved races and sovereigns are saved out to the 'My Games/Elemental' directories of 'Units' and 'Races'.
Details:
+ Added missing AddRef for CCreateSovereignWndMessageData::GetFactionConfig ()
+ Added handling for drag end message for when items are dragged onto the unit scene view
+ Now uses passed-in faction config to initialize the sovereign unit type
+ Saves created unit type to the passed-in faction config
+ Unhide sets the faction spellbook name to TestSpellbook, instead of setting it as a starting spell
+ CopyDisplayTextIntoPlayer saves an internal name for the new faction, equal to the display name for now
+ Fixed bug in SetUnitTypeMale and SetUnitTypeFemale where it would skip unequipping some incompatible equipment because it was removing them while going
through the list and not updating the index correctly
+ Added m_lCustomizationPointsToAssign
+ Added GetPoints
+ SetUnitTypeMale and SetUnitTypeFemale call ResetInitialBackupHairAndClothes on g_pCreateSovereignAppearanceSubWnd, so it will keep the right hair and everything even if that subwnd isn't hidden at that point
+ Remembering hair and clothes when deselecting equipment
- People should play with it and see if it makes sense the way equipping/unequipping things behaves and is displayed now, because I tried out a few different combinations of displaying backup hair/clothes and whether equipment always overrides hair/clothes, and didn't find a way that felt particularly awesome. Right now, if you equip hair/clothes in a given slot, it remembers that when you equip some sort of equipment in that slot instead so that when you unequip the equipment, the hair/clothes are still there. But the entries don't appear equipped when there is a piece of equipment taking that slot instead, and equipping hair/clothes in a slot will still remove the regular equipment in that slot. This makes sense to me when I mess around with it, but other people should say if it doesn't and have other suggestions.
+ Made ToggleAbilityBonus public instead of private
+ Changed Callback to handle clicking and highlighting the same way the entries in create sovereign screen do
+ Made string controls non-transparent
+ Added UpdatePointsDisplay and OnEntryHighlighted
+ Replaced FillInfoForSelected with FillInfoForSelectedAbilityEntry and FillInfoForSelectedColorEntry
+ Changing abilities doesn't update the 3D scene anymore
+ Removed some unneeded refills of the ability and entry lists
+ Changed Callback to handle selection and highlighting of the various entries the same way the create sovereign screen does
+ Added bRecreateUnit parameter to Update3DScene
+ Update3DScene uses CreateRandomizedUnitType to make the unit for display
********
* Magic *
Overview:
You can now build up spell points and spend them on available magic spells. These can then be cast if you're tapping into the appropriate shards.
Details:
+ Mana Types
- Make simpler resource types for 'Fire Shard', 'Air Shard', etc...improvements give those
- List Global Player Resources and shards in the kindgom window
- Weed out Elemental Shards giving special mana types
- Not-Stored Generic resources calculating properly for the player
- easy APIs to grab the mana values from a player+ Fixed a problem with the stamp XML that was releasing too many refs from the tile data, causing the data to be trashed by the time the game tried to place a stamp.
+ Modified the spell casting code so that spells cannot be cast outside of their specified range.
+ Added a new XML tag “SpellType” to the SpellDef, which defines when a spell can be used. If set to “Strategic”, it can only be cast on the strategic map. “Tactical” spells can only be used in tactical battles, and “Universal” spells can be used anywhere.
+ Re-enabled spell casting. Currently, Volcanic Eruption is the only spell that shows up, since it’s the only one that’s had its type set to “Strategic”.
+ Fixed issue with CWorld::RaiseLandAtTile( ) and CWorld::LowerLandAtTile( ) not correctly adjusting the heights of the terrain.
+ Modified the spell casting selection graphic so that it turns red when the mouse is pointing at an invalid target (for instance, if the target is outside of the spell’s range), and green when it’s over a valid target. If the player attempts to cast the spell while over an invalid target, nothing will happen.
+ Added a SpellClass tag to the SpellDef XML, which dictates the conditions required for the spell to be cast. Current classes are “Offensive”, “Defensive”, “Terraform” and “Other”. Offensive spells cannot be cast on a tile that would affect the caster (which prevents the user from dropping a volcano on their sovereign and instantly losing the game). Terraforming spells cannot be cast on a tile with a unit or game object (i.e., improvement, goodie hut, resource, shard, ect.). Unless specified, all spells default to “Other”.
+ Added a SpellTargetType tag to the SpellDef XML, which defines where, and on what, a spell may be cast. Current target types include “FriendlyUnit”, “EnemyUnit”, “Monster”, “Self”, “FriendlyTerritory”, and “Any”. Unless specified, all spells default to “Any”.
+ Champion units other than the Sovereign are now able to cast spells (such as his children, after they come of age).
+ Created Mass Heal and Charm Monster spells, disabled the Volcanic Eruption spell. The Mass Heal spell can only be cast on friendly units, while the Charm Monster spell can only be cast on creature units.
+ There’s now only one generic type of mana, which is used to cast all spells, instead of the six (life, death, fire, water, air, and earth) we used to have.
+ Incremented the save game version to 12, as units now only save one current mana variable, rather than both the current and maximum values for each old type of mana.
****************
* Wandering Heroes *
Overview:
The world is now populated by a handful of wondering heroes, scouring the world for treasure and adventrure. They cannot be yet recruited, but give a nice XP boost if you best them in combat.
Details:
+ Created and added AiChampNPC. It is a class much like the AICreature class, a class to represent a player that is the AI brain for the NPC champs.
+ added faction type FACTION_TYPE_CHAMP_NPC
+ Added m_ulChampNPCPlayerID, GetChampNPCPlayerID(), IsWildCreaturePlayer(id), IsChampNPCPlayer(id), CreateChampNPCPlayer(), and GetChampNPCPlayer().
+ added m_ulChampNPCPlayerID to ctr
+ changed params of CreatePlayer() to also include a bool for whether or not the player being created is the NPC Champ player.
+ CreateChampNPCPlayer() creates a player to control the NPCs. Then creates 5 NPCs and puts them on the map.
+ when setting relations of players and creatures to PERMANENT_WAR, also set relations between the Champ NPC player and other players to be NEUTRAL.
+ added code so that the local player will not get the FIRST_CONTACT message from the NPC Champ player.
+ added a member vector of unit type pointers, so they can be saved and loaded
+ added function called StoreUnitType(), which takes a PUnitType param, and adds it to the vector
+ when Champ NPC player creates their 5 NPC champs from a randomized unit type, it now calls CAIChampNPC::StoreUnitType()
***********
* Leveling Up *
Overview:
You now get points to spend on stats when a unit levels up.
Details:
+ added member variable PUnitStatType m_pUnitStatType, initialized to NULL, set in ctr, SAFE_RELEASED in dtr.
+ removed member variable TString m_strUnitStatInternalName and adjusted code that used it to use m_pUnitStatType->GetInternalName() instead
+ removed code for the BONUS_VALUE part of the screen, since +/- buttons will now affect the stats cur value and there will no longer be a BONUS_VALUE section
+ displayed value for stat is m_fInitialValue + GetAddedValue().
+ GetAddedValue() returns result of m_pUnitStatType->GetAffectPerLevelUpPoint() * m_ulAddedPoints;
+ When LevelUpWnd is closed, stat increases are applied as before.
-------------------
- MINOR FEATURES -
-------------------
****************
* Unit Customization *
Overview:
Soldier units now use the same model as the sovereign unit, so all clothing can be used on either type of character. Players can now cycle through their available citizenry to select the right starting unit for the job (purely cosmetic).
Details:
+ Single-click equips/unequips items
+ Can't unequip in weapons list, must always have one entry selected
+ Hid equip/unequip button
+ Added CheckForMandatoryItems
+ Cleaned up selection/highlight behavior in Callback so that it behaves more like you would expect when double-clicking entries
+ Removed m_mapSelectedEntries
+ Added ClearSelectedEntryInfo
+ Removed SetSelectedEntryForFilter
+ Reimplemented functions to have mouseover/selection behavior match other screens
+ Item list now actually handles entry memory properly on it's own
+ Added m_apBackupHairAndClothes
+ Added RandomizeNewUnitType, OnNewUnitTypeBeingDesigned, IsBackupHairOrClothes, EquipBackupItem, UnequipBackupItem, and ResetInitialBackupHairAndClothes
+ Accesories now added in FillItemList
+ Added class CInfoCardSaveWndMessageData_UnitDesignWnd
+ Fixed crash in ClearUnitType
+ CanSaveUnitType now lets you create unit designs with the same name, they just get different internal names
+ Added handling for the two different unit stat modifiers, with a message to get rid of the old one once the xml is updated
+ When the info card save wnd pops up, shows a nicer default name now
**********************
* City Construction Window *
Overview:
The popup that holds the available improvements has been overhauled, streamlining the data presented and greying out improvements that cannot currently be built.
Details:
+ Checked in BuildListEntryWnd.dxpack
+ Added a global version of g_pMainMapViewWindow->LeaveCityConstructionMode() called UILeaveCityConstructionMode() to ElementalUI.cpp
+ Updated BuildListWnd.cpp to use UILeaveCityConstructionMode()
+ Added BuildListEntryStatsWnd.dxpack, which is necessary for the changes to the citybuilding screen.
+ Added Icon_Turns_To_Build.png, which is necessary for the changes to the citybuilding screen.
+ Added BuildListEntryStatsWnd.h/.cpp, which contain the code for the associated dxpack.
+ Modified Elemental.vcproj to contain BuildListEntryStatsWnd.h/.cpp.
+ Made many improvements to the citybuilding interface; each improvement now gets an entry with its name and all the resources that improvement requires.
+ Improved how the citbuilding interface moves and resizes itself based on screen resolution.
+ BuildListEntryWnd.cpp now puts the appropriate text on the "Demolish Building" button.
+ ElementalUI.cpp now has two new functions, UIUpdateCityBuildingContext(CImprovement * pModifiedCityHub) and UIShowCityBuildingContext(CImprovement * pModifiedCityHub). These allow the build queue to be updated as buildings are built.
+ MainGameWnd.cpp's UpdateContext() function was not allowing a context update if the game was not in the default mode. Since we need context updates in citybuilding mode, I removed this check.
+ City.cpp's AddImprovement() function now calls UIUpdateCityBuildingContext() and UIShowCityBuildingContext() after a successful improvement place. This actually updates the build queue.
+ The currently selected improvement will no longer be deselected after placing the improvement.
+ The "Build" button has been now been implemented. Clicking it will instantly build an instance of the currently selected improvement. It (like the double-click) is using g_pMainGameWnd->BuildMode_AutoPlaceImprovement() to build the improvement, which doesn't do a very good job, but at least it's hooked up to the right code now.
+ Made a slight change to ConstructImprovement() in City.cpp to more accurately tell the player whether or not they have enough available
tiles to build the currently selected improvement.
+ Fixed the problem of tiles showing up green when the game is not in citybuilding mode.
+ Greatly increased the response rate of the citybuilding interface.
+ Fixed improvements not getting selected in the citybuilding interface if you clicked on their resources instead of their name and icon.
****************
* City Management *
Overview: There are now certain limitations on building construction based on the city level. Players also have considerably more tiles to play with, and a new status bar properly conveys where your population bottleneck is in a selected city. The first city you build is also deemed your capitol, getting a slight bonus in various areas of production. Outposts now rely completely on building placement to dictate the production of gold, spell points,
***************
* Technology Tree *
Overview: New improvements and abilities have been organized and re-prioritized throughout a modified technology tree.
***************
* Battle System *
Overview:
Battles have now been reworked to make full use of the unit stat 'Combat Speed', phasing the turn into 10 sections and allowing attacks based on this value. Units will also use items as necessary post-battle.
Details:
+ when a battle is decided and results processed, if the winner was the AI, they are now notified so that they can use any HP booster items they might have.
+ in ProcessBattleResults(), when checking that num defenders is == 1, now passing TRUE to pCity->GetStationedUnitCount() so that only units that are owned by the city owner are counted.
+ when checking to see if a city has only one defender, passing a player ID now, so only certain stationed units are counted.
+ Initial commit of the new phased movement-based combat.
+ Changed how the battle rating is calculated for each unit.
+ Updated InitializeBattleWnd.dxpack to a new version created by Paul and changed the stats it displays
+ Near-final version of unit-on-unit combat. Stacks are now correctly handled on both the attacking and defending sides.
+ Implemented the new combat resolution screen that Paul provided.
+ Fixed the asserts that the screen was causing do to a lack of corresponding code.
+ Added m_lDamageDoneLastBattle to the Unit class so that data will be avaiable for display.
--------
- MISC -
--------
*****
* AI *
+ in AIIsCityProperlyDefendedWithoutMe(), it just currently checks to see if the city is defended by more than 1 unit. In that check, I'm passing a Player ID now so only the correct units are counted.
+ added an override for the newly created AIWillAcceptArrangedMarriage(). Left a pragma about needing more logic. Currently it will check the parameter pointers and if either are NULL it will return INVALID_DATA, else it checks to make sure the genders of the pointers are opposite, return MARRIAGE_REASON_NO_SAME_SEX if not. Else it returns MARRIAGE_REASON_YES.
+ now using ross's new function for goodie huts, ->GetIsQuestTarget(), so I can disclude those goodiehuts when the AI is looking for the closest goodie hut. If we want the AI to find the closest quest goodie hut, we can make a new function just for that.
+ added an enum called eMarriageResponses, which contains all the reasons why a marriage would be ok'd or denied by the AI. currrently just has MARRIAGE_REASON_YES, and MARRIAGE_REASON_NO_SAME_SEX.
+ added a pure virtual function called AIWillAcceptArrangedMarriage(). It takes two champion pointers, one for the AI kid, and the other for the potential mate. AIBasic then has an override where we can place logic.
+ added an override for the newly created AIWillAcceptArrangedMarriage(). Left a pragma about needing more logic. Currently it will check the parameter pointers and if either are NULL it will return INVALID_DATA, else it checks to make sure the genders of the pointers are opposite, return MARRIAGE_REASON_NO_SAME_SEX if not. Else it returns MARRIAGE_REASON_YES.
+ now using two APIs that I created. They are called: AiCalcShouldContinueAutoPatrol() which takes the ID of the unit in question, and AiCalcShouldContinueTargetingUnit(), which takes a pointer to the unit in question, as well as the target unit pointer. the Auto patrol one will chase after tresspassers if there are any in the radius. The Targeting one will cancel targeting of the tresspasser if they go beyond 2xRadius
+ added a missing SAFE_RELEASE for a rally point pointer
+ when a unit is finished training, it checks to see if the Sov needs protection and if so, checks to see it's that own battle rank is above 0, and if so, sets the sov as a target dest to go protect them. Otherwise it goes to a army rally point as before.
********************
* Kingdom Details Screen *
- added an income entry for Trade Bonus.
- added an expense entry for Roads Under Construction.
********
* Player *
+ added function FLOAT GetExpense_RoadsUnderConstruction(). It goes through each of the players cities and calls pCity->CalcRoadExpense() so it can return the sum.
+ GetExpense_RoadsUnderConstruction() is now added to the running total that is returned in
GetExpenses_All().
+ Added a function called LPCTSTR GetLastResearchedTechDisplayName(), that is a wrapper to that player's tech tree manager, and calls it's function of the same name and returns the value
+ When a player unlocks a tech, and they are an AI, and they've encountered the local player, for now they will always pop up a TALK_WE_HAVE_TECHS conversation with the local player. We'll likely want to tone this down in frequency, but left it like this initially.
******
* City *
+ Added function FLOAT CalcRoadExpense(). It simply sums the cost per day of all that cities under-construction roads, then returns the sum.
- Removed class CCityTile. Its code is consolidated into CCityTileObject
- AddOwnedTile now returns a pointer to the CCityTileObject that was created
- Renamed vectors that used CCityTile structs to have the name Object in it, to make certain that I caught all instances
- Removed m_aBuildableTiles and m_aBuildableSubTiles as they are not being used
- Moved clearing of the city tile vectors to the bottom of the Clear function to avoid conflicts
- They now use SafeDestroyBasicGameObjectVector and SafeReleaseVector functions to clear the vectors
- AddOwnedTile now checks to make sure that the tile is not already in the vector and returns a pointer to the new tile
- RemoveOwnedTile also removes the tile from the sector mapper
- IsOwnedTile now uses std::find_if for greater speed
- Changed code that looped through vectors to use iterators instead of [ ]
- When adding an owned tile, it now sets pointers to the improvement in CCityTileObject
- Changes to BuildAllowedSubtileList
- DestroyImprovement now only removes an owned tile if there are no improvements on it since there are no longer duplicates in the m_aCityTileObjects vector, it just removes the improvement.
+ Changed ReleaseStationedUnit to use a vector of TilePairs instead of city tiles for less overhead
+ Since you can station yourself in a foreign city, I added a default param to GetStationedUnitCount(). It's BOOL bOwnerUnitsOnly and it defaults to FALSE. When true, it will only return the count of the units stationed that are owned by the city owner. this is useful for when you call pCity->IsDefended(), which was originally just checking that pCity->GetStationedUnitCount() was greater than zero. In that case we are only interested in city owner's units, so we have to pass TRUE to get the actual count of city owner's units only.
+ added some necessary owner checks to CalcSumBattleRankOfDefenders(). they are required since not all stationed units are necessarily owned by the city owner.
+ added some necessary owner checks to SetNewOwner(). they are required since not all stationed units are necessarily owned by the city owner.
****************
* Random Names *
+ Added "nazi" to ban list in name generator
****************
* Diplomacy Screen *
+ Diplomacy Screen: added SetOtherLeaderMood function to update animation based on leader's mood ( happy, neutral, angry )
+ added some code to topics work when going back and forth between trade mode, diplomacy menu mode, and other modes.
+ added code so that when a trade is accepted, it attempts to use a TALK_TRADE_ACCEPTED conversation
******
* Map *
+ Fixed bug where objects were not updating their visiblity when the camera moved
+ When you unlock the camera on the main screen using cheat key, the camera will not clip the terrain
+ Double-clicking on the center medallion in the main UI centers the camera on the currently selected object
+ Set up new camera view for 5 key
+ Default zoom when starting the game is much closer now
+ Cloth Terrain Objects now have a GetClothIconFile function to return the icon file
+ Fixed fertile ground not showing up when you start the game
**********
* Caravans *
+ Added overload for function CityHit to do hit detection on city tiles
+ Commented out overload for function ImprovementHit, since caravans don't need to do improvement hit detection
***********
* Flavor Text *
+ renamed m_mapFactionTextMaps, cause they really weren't faction specific
+ added function GetFlavorTextForTopicAtIndex() to retreive the flavor text entry at a given index in the list for a given topic
+ added function GetFlavorTextCountForTopic() to get the number of flavor text entries for a given topic
*******
* Units *
+ Added a default param to AddPersonalItem() and it's overload. It's BOOL bWasEquipped, and defaults to FALSE. When an item is added to inventory, and it's an AI unit, they are notified so that they can see if they should equip it. If so they will. To prevent the AI from being notified endlessly everytime an item is unequiped in order to equip something, pass TRUE as the third param so that the notification is skipped
+ in RemovePersonalItemByIndex(), only updates context areas if it's the local player's unit
+ in CompareOurBattleStrengthToOthersInRadius() added some needed unit owner checks. they are required since not all stationed
units are necessarily owned by the city owner.
+ Added gender to unit type
+ When unhiding a conversation about entering foreign territory, now using a #define value for topic instead of a string literal.
+ Champion units get their own experience points
+ Tweak level-up wnd to not always say 'You Sovereign has Gained a Level'
+ SetDestination() only updates the main context area if unit is owned by the local player
+ CancelDestination() the one that's an overriden from mobileObject and doesnt take a param, is being used as a wrapper for the unit defined function of the same name that takes a param for whether or not to cancel the target unit. The wrapper was always passing TRUE for this param, but I think FALSE is the most logical thing to pass, and use can call the one that take a param explictly if you need to cancel the target unit. Reasoning is that lots of things call CancelDest(), SetDest() being one of them. This was part of the reason why unit targeting was broken.
+ added some code in UpdateDestinatinoBasedOnTarget() so that if the unit is an AI Creature, it will call and AICreature API that I made to see if it shoudl still be following the target (ie. make sure they aren't too far away, which right now i have set to 2xradius).
+ now not bothering to update dest if the target is still at my old dest. Makes less calls, should be faster.
+ fixed a param for PostEVent_SetDestination() that was a BOOL, when it was supposed to be a pointer. using NULL instead of FALSE now, to be explicit, even though they both mean 0.
+ Changed SetMovesLeft to call UIRefreshMovesLeft instead of updating the entire context window
+ Changed SetDestination to call UIRefreshDestination instead of updating the entire context window
+ CityHit now checks to see if the tile destination is the city tile before marking it as blocked
+ Fixed bug where DungeonHit was not returning true after setting that the path was blocked
+ Commented out call to UpdateMainGameWndContext in OnMoveIntoTile, as this appears to be redundant
+ CalcAStarNumMoves and CalcAStarMoveCost no longer need to divide direction index by 45
+ Added call to UIRefreshDestination in CancelDestination
+ Changed CalcAStarMoveCost to exit earlier if the tile is blocked, instead of doing object hit detection or checking the tile owner
+ DoesWaterUnitDestCrossLandBridge doesn't need to divide the index by 45 anymore
+ Added GetManaRegenPerTurn(), which checks your MANA_REGEN ability, which is a percent, multiplies it by your max mana (which is capped at essense) to get the per turn mana regen out value. if you are stationed in a city, it's +5 mana to that value, and if you are simply in your ZOC, it's just +2 to that value. These are the values we were using before the MANA_REGEN ability was added. So we'll have to decide whether to tweak them or take them out completely. I do think it's nice to have a way to complement your abilty though.
+ Removed a bunch of old stat functions that we no longer use or want anybody to try to use. Basically all the ones that take a ULONG for stat ID.
+ Put HP regen back into UpdateTurn(), I think it got removed because of some merge errors. +5 HP if stationed in a city, +2 if in ZOC, or just +1 HP otherwise.
********
* Items *
+ added a function called CalcGameModifierValues(..) which does the same thing as the ImprovementType version. You pass in a modType and attribute that you are interested in, and it returns whether or not there are any modifiers of that type for that attribute. It also gives you the values if you need them. The AI uses these functions to determine what benefits their personal items provide.
********
* Editors *
+ The map editor now sports the ability to select and place an arbitrary number of terrain types within each terrain category. If there is more than one terrain type available in a category, clicking the corresponding button will bring up a list of available types. For the moment, this only occurs when clicking the land tool, since it’s the only category with more than one type. However, as more terrain types are added, they will automatically become available for placement in the editor.
+ Added the ability to place player starting locations to the map editor. For the moment, there is no UI for placing the start locations; it must be done through keyboard shortcuts. To place the starting location for player 1 (the human player in single-player games), hover the mouse over the desired tile and press Control-1. The starting locations for players 2 through 8 are also done in the same fashion, with Control plus the player’s number. Starting locations are color-coded to make it easier to keep them straight.
+ Flavor Text Editor
- FlavorTextEditorSpinnerEntry Class made
- FlavorTextEditorOptionEntry Class made
- Rules listing
- Rules can be set, filling from selected Flavor Text
- Rules canceling one another out, as applicable
- 'Revisited Topic' value can be set, filled from selected Flavor Text
- Speaker can be set- Listener can be set
- make text smaller in toggle entries
- Replacement Tag Buttons properly adding tags to text
- Editor toggling through multiple strings for a given flavor text entry
- New strings can be added to a flavor text entry
- DONE updating list entry when flavor text is edited
- DBLCLICKING a list entry takes it to 'edit' mode
- CANCEL button on edit screen that reverts changes
- data saving out to My Documents folder
- RevisitedTopicBarrier not saving out if INVALID_DATA
+ Item Editor
- unhide a 'Load Item' screen between workshop wnd and item editor
- Load Item wnd listing all items in the game
- CANCEL returns to WorkshopWnd
- can start a NEW item
- can LOAD an item in the editor
- Weed out major asserts throughout the item editor
- fill the Unit:Attributes mod spinner with the data-driven unit stats
- ModType: GiveItem spinner added
- GiveItem spinner listing the data-driven items to pick from
- Modifier Description generating for a 'Give Item' mod.
- Modifier returns the item's icon as it's 'image'
- Modifier that alters a UnitStat returns that stat's icon as it's 'image'
- Items saving out, now with a GiveItem modifier that can be set dynamicially
******************
* Conversation Window *
+ removed the BOOL variables and the Get/Set functions for response types, since they are no longer needed, the xml drives the responses a topic has
+ added some tags to the flavor text parser, for faction short name, and the factions last researched tech
+ AddReponse() will then be able to tell if a response of that type was actually defined in the xml, and if not won't create a response entry.
+ now adding all response types to a topic in UpdateData(), since AddResponse() is now smart enough to know which ones to actually create.
+ OnResponseSelected() now uses the #define values instead of string literals when checking response type of the response that was clicked so it can do what it's supposed to (ie. close wnd, open up trade wnd, etc..)
*********
* End Turn *
+ Cleaned up world/player 'End Turn' Code
- Move Player EndTurn logic into a new file "Player_EndTurn.cpp"
- All player updating logic delt with inside the player loop (right now some funtions get called in the loop, but others use their own redundant loop)
- Move the updating of Improvements into the City update code
- remove CImprovement:
erformTurnIncome...all resource handling stuff is now dealt with in CCIty
--------------------------
- ENGINE IMPROVEMENTS -
--------------------------
+ Added clipboard support to Entry Fields. (CTRL+C, CTRL+V, CTRL+X)
+ Cut Scene Object Data: sets the effect file, position, rotation, scale, ambient, diffuse, and light direction for static objects in the cut scene
+ Finished implementing MWin3DGraphic
- Now supports being moved, resized, scaled, etc.
- Positioning in 3D works with more MWin subclasses
- Reworked to use child scene nodes for child windows, so that individual windows can be clicked from a scene view window, e.g.
- Fixed some issues with drawing windows in correct z order so that they don't flicker
- Reimplemented the family tree in the dynasty screen to use an MWin3DGraphic for each node instead of rendering the node wnds to a bunch of new
textures
*********
* Batching *
+ Cleaned up the elemental model batch code by removing unused techniques and code
+ Removed unneeded render modes from model batch code
+ Elemental's unskinned batching is now working for both shader 2.0 and shader 3.0 versions
+ Elemental's animated models can now use a total of 78 bones
+ Elemental unit gfx now use LOD object models for their equipment so the equipment is batched together
*********************
* New Cloth Icon Manager *
( for faster rendering of cloth icons )
+ The cloth icons used to render pretty slowly because they filled the batch every frame with only the ones visible at that time
+ This caused the batches to lock the buffer, fill it, and unlock it constantly which can get expensive
+ The new cloth icon manager has been implemented to optimize rendering of cloth map icons
+ The cloth icon manager is initialized in InitMapGfx
+ When an object is unhidden it adds an instance to the cloth icon manager
+ When an object is hidden it removes its instance from the cloth icon manager
+ The cloth icon manager is updated in UpdateMapGfx
+ Any cloth icon that is "dirty" will have its batch updated
+ This way the batch only changes when necessary, not every frame like it used to do
+ The cloth icon manager is uninitialized in CleanupMapGfx
+ The cloth icon manager uses the new "persistent" batch interface
+ Persistent batches are batches that are not cleared when the frame starts
+ All of the game objects except for cities/improvements are using the new cloth icon manager
OTHER OPTIMIZATIONS
+ Removed unneeded InitMapTerrainObjectGfx function (startup will be a little quicker)
+ Terrain Cloth Map Objects are now only stored in CWorld
+ They used to get added to sector mapper which was bogging things down
+ Terrain cloth icons are now created in UpdateTerrainClothMapIcons in CMainMapViewWindow
+ The UIUpdateTerrainClothMapIcons function is used to update them when FOW changes
****************
* Multiplayer Server *
+ Put #ifdef NO_GFX around graphic code
+ CityTileObject.h/cpp
+ Elemental.h/cpp
+ ElementalData.cpp
+ Improvement.cpp
+ MapSaver.cpp
+ SpellRepository.cpp
+ TacticalObject.h/cpp
+ TacticalUnit.h/cpp
+ TerrainClothMapObject.h/cpp
+ Moved more code to TerrainDefines.h from TerrainHelpers.h
+ TileDesignObject.h/cpp
+ Unit.h/cpp
+ World.h/cpp
+ World_MapData.cpp
+ Moved CurveGenerator.h/cpp to Kumquat3D
+ Moved HeightmapGenerator.h/cpp to Elemental\source\MapData from source\scenenodes\terrainhelpers
+ Moved TerrainHelpers.h/cpp to Elemental\Source\MapData from source\scenenodes\terrainhelpers
+ Added ElementalServerShell.h/cpp
+ Shell class for the server
+ Added ElementalUIWrappers.h/cpp
+ has empty wrapper functions copied from ElementalUI.h/cpp
+ Added more #ifndef NO_GFX, and in cases referencing tile design or map stamps, removed them
+ City.cpp
+ CityTileObject.cpp
+ DynasyMember.cpp
+ Elemental.cpp
+ Also moved StartNewGame here
+ ElementalData.cpp
+ ElementalShell.cpp
+ Moved m_fTotalElapsedSeconds to basic shell
+ MapData.cpp
+ MapSaver.cpp
+ MapStamp.h/cpp
+ MapStampTileInfo.h/cpp
+ MobileObject.h/cpp
+ QuestData.cpp
+ StartupProcesses.h/cpp
+ TacticalMapData.cpp
+ TacticalMapGenerator.cpp
+ TacticalObject.cpp
+ TerrainClothMapObject.cpp
+ TileDesgin.h/cpp
+ TileDesginManager.h/cpp
+ Unit.h/cpp
+ World.h/cpp
+ World_MapData.cpp
+ Changes to ElementalUI.cpp
+ Moved StartNewGame to Elemental.cpp
+ Changes to ElementalMulitplayerMesasges.h/cpp
+ Added m_SenderSystemAddress
+ Added m_SenderRakNetGUID
+ Added m_SenderGUID
+ Added constructor that takes a packet
+ Added function GetMsgID
+ Changes to ElementalServer.vcproj
+ Got it compiling in release
+ Changes to ElementalServerShell.h/cpp
+ Added functions LoadCoreXMLData and LoadGameXMLData
+ Added support for downloading data
+ Implemented ParseCommandLine
+ Fixed bug where spell repository and name generator were not being initialized
+ Changes to ElementalShell.cpp
+ Moved m_bLocalDataOnly to base
+ Changes to MultiplayerClient.cpp
+ DownloadXMLData now returns S_OK instead of TRUE
+ Changes to PlayerMPData.h/cpp
+ Added member m_UserGUID
+ Added member m_strUserGUID
+ Wrote function GetUserGUID to get guid from registry or generate it