Tuesday, July 5, 2016

Change Log: 1.40.743

Release 1.40.743 is major feature release: http://kdm-manager.com now supports alternate campaigns.

And that feature, just by itself, was no small feat: to facilitate alternate campaign support, this release pushes hundreds of lines of back-end refactoring and re-architecting.

Additionally, this mega-release also revises the way that new settlements are created/updated, refactors a ton of Settlement Sheet code (back-end and front-end), adds full support for the Sunstalker and includes Beta Challenge Scenario assets and automation.

(I am aware that Poots put the informal kibosh on the challenge scenarios, but I have my own reasons for adding support for them.)

As with most major releases, I anticipate some fallout from this one in the form of bugs, errors, typos, etc., but 1.40.743 is the largest single release I have ever done, so I would like to thank everyone in advance for your bug reports and your patience.

Also, I might do a quick release tomorrow or the next day if I end up running into or hearing about a lot of problems in this release. Otherwise, I think I'm going to take a short break from feature development and focus on Github for a while.

Corrections and Fixes

  • I finally refactored the "People of the Lantern" timeline to use lists (Manager v1.3n style).
  • Adding expansion content to a settlement (using Settlement Sheet controls) no longer adds expansion events to previous/concluded lantern years.
  • Removed manually-keyed page number references from all timeline events in game_assets.py.
  • Normalized the presentation on the Dashboard "World" panel "Latest survivor fatality" info (to use unordered list style, rather than line breaks and indenting).
  • Normalized presentation of admin panel settlement summaries and added campaign type to summary blocks.
  • Removed <br/> spam from new_settlement view and (finally) fixed the margins on everything.
  • Added Innovate endeavor formulae to "Lantern Hoard" and "The Sun" locations.
  • Fixed the margins on asset lists (e.g. locations, innovations, etc.) on the Settlement Sheet and the Campaign Summary view.
  • Fixed quarry sort order to reflect the levels at which various quarry may be hunted. Also updated the "Old Master" quarry to not have levels.
  • Fixed a sorting/list index bug in models.py that caused "Wardrobe Expert" (Lion Knight) to invisibly appear in the Fighting Arts decks of all survivors (affecting the selection of random fighting arts).
  • assets.Settlement.get_nemeses() now uses assets.Settlement.get_expansions() rather than custom logic to determine which expansions are active.
  • Corrected debug logging in assets.Survivor.add_game_asset() to use __repr__ style references instead of attribute calls. Did the same thing for user action logging in session.py
  • Added "White Lion (First Story)" to quarry options on the Timeline for LY0 (for all campaigns: it's hard-coded into assets.py.
  • Timeline Refactor: Settlement Sheet controls for timeline now use kdm-font-10 for story event and quarry icons;  completed Lantern Years are now hidden by default (and can be viewed using a show/hide toggle button); Lantern Years more than five years from present are also hidden by default.
  • Milestones Refactor: milestones, which were formerly hard-coded into assets.py, are now attributes of campaigns. Settlement Sheet controls for milestones are generated procedurally (this one's been a long time coming) using page number references from game_assets.py. Milestone attribs include sort_orderstory_eventadd_to_timeline (which is a statement to be eval()'d during timeline rendering), etc.
  • Milestones Refactor: assets.py now has a update_milestones() method for toggling milestones. It accepts a list. assets.Settlement.modify() now uses this method and the old style of direct settlement attribute updates is deprecated.
  • Principles Refactor: principles are now an attribute of campaigns and their Settlement Sheet controls are generated programmatically (rather than being hard-coded). assets.Settlement.get_principles() has been totally overhauled and assets.Settlement.modify() and assets.Settlement.render_html_form() have been greatly simplified, including the total deprecation of the idiotic p_controls concept.
  • Fixed the "Pottery" innovation's "Special Innovate" endeavor so that it disappears from the Campaign Summary after the "Barber Surgeon" location is built.
  • Finally updated assets.get_principles() so that it supports the "user_defined" value for 'return_type' (and displays Settlement Principles accordingly).
  • Fixed an issue that caused certain Gormery/Gormchymist items to appear in the drop-down controls for other locations.
  • Fixed a bug that made the Watcher appear twice in the Timeline controls for adding a nemesis event.
  • Fixed a handful of presentation issues including: vertical spacing between add storage dropdowns at narrow resolution, an issue where a single survivor skipping next hunt would overlap with the "Retured" toggle on the Campaign Summary view, font size consistency issues on the Survivor Sheet at narrow reoslution, survivor hit box alignment at narrow resolution, etc.


  • Feature: added game_assets.campaigns dict to contain campaign-specific assets and logic. -MR
  • Updated assets.Settlement.new() to use game_assets.campaigns for the following starting settlement attributes:
    • campaign (asset key/str)
    • timeline (list)
    • nemesis_monsters (list)
  • Revised new_settlement view to include controls for setting campaign.
  • Added "People of the Sun" timeline to game_assets.py.
  • Expansion dictionaries may now include the "existing_campaign_only" attribute, which will prevent them from being toggle-able on the new_settlement view.
  • Campaign type is now indicated on the Settlement Sheet (along with a title-/tool-tip indicating that campaign may not be changed after a settlement has been created).
  • Sunstalker: Added a Sunstalker campaign and keyed in the timeline, principles and milestones for it.
  • Sunstalker: Keyed in Sunstalker assets, including: a quarry, a nemesis ("Ancient Sunstalker"), survival actions (2), locations (3), disorders (3), strange resources (7), fighting arts (8), Katana specialization/mastery, gear cards (23) and innovations (7). Added "Permanent Red Affinity" to abilities and impairments.
  • Sunstalker: Created game_assets.story_events dict in order to abstract page numbers for the timeline, etc. Keyed in page numbers for a bunch of core and Sunstalker events.
  • session.py now passes campaign type to assets.Settlement.new() on new settlement creation.
  • Added kwarg "return_type" handling to world.latest_kill(). Added latest kill info to admin panel.
  • Collapsed html.render_expansion_toggles and html.render_survivor_toggles() into a single html.render_checkboxes() function.
  • Added "Sworn Enemy" to Beta Challenge Scenarios disorder deck. Added the "Red Glow", "Blue Glow", "Green Glow", "Twilight Succession" and "Solid" abilities to the Beta Challenge Scenarios abilities and impairments deck.
  • Feature: individual pre-fab survivors may now be automatically added to settlements at creation time using the new_settlement view.
  • Added pre-fab survivors to game_assets.py and the new_settlement view:
    • Candy & Cola
    • Adam and Anna
    • Paul the Survivor
    • Kara Black
    • Messenger of the First Story
    • Messenger of Courage
    • Messenger of Humanity
    • Snow the Savior
  • Added Vibrant Lantern and Dying Lantern to Rare Gear. -keytmi
  • Created inline_shield style for hit location annotations in flavor text. Updated descriptions for "Crystal Skin", "Specialization - Shield" and "Necromancer".
  • models.Model.get_always_available() now references game_assets.campaigns and game_assets.expansions when creating asset decks (rather than individual location and innovation dicts). Additionally, the always_available boolean is only used on individual assets to force them into a deck, no matter what.
  • Fully deprecated the "nickname" attribute and substitution concept between game_assets.expansions and html.py in favor of programmatic asset ID/key creation.
  • Feature: added support for location levels (so far, the "Sacred Pool" is the only one using it, but the feature is fully implemented and extensible).
  • Moved survivor Fighting Arts deck building function from assets.py to models.py. Added models.Model.get_always_available() pass to models.
  • Sunstalker: added get_forbidden() method to models.Model. For now, it only checks the campaign (but I am prepared to expand the scope of the checks in the future.) The "Leader" Fighting Art is forbidden in the "People of the Sun" campaign.
  • models.render_as_html_dropdown() now accepts 'Settlement' kwarg, which should be a Settlement object and is used for exclusions. Deprecated use of the 'expansions' kwarg in calls to the method made by assets.py.
  • Added limited support for incomplete asset dicts to assets.get_campaign(). Added 'return_type' kwarg and the ability to return the campaign dict to assets.get_campaign().
  • Added "Settlement" kwarg to models.get_keys(), which takes a Settlement object and checks expansion/campaign content.
  • Sunstalker: Survival Actions now have a model in models.py (they were formerly just a list in game_assets.py) and have attributes, such as 'expansion', etc. Survival Actions are now expansion-specific.
  • Survival Actions on the Survivor Sheet now sort according to the order defined in game_assets.py.
  • Added location special rules banners to Campaign Summary view ("The Sun" is the only one that uses this feature for now).
  • Moved endeavor HTML out of assets.py (and into html.py) and touched up assets.get_endeavors() to do a little extra prettification when displaying "Innovate", "Build" and "Special Innovate" endeavors.
  • Feature: the Settlement Timeline is now automatically updated when a campaign's milestone threshold conditions are met: the story event that corresponds with the milestone will be automatically added to the currently Lantern Year.
  • Timeline auto-updates are now controlled by a Dashboard preference.
  • Refactored the Campaign Summary view: the departure buffs are now listed by the Hunting Party controls, the "Available Endeavors" box is separate from the "Settlement Bonuses" box.
  • Deprecated assets.Settlement.hooded_knight_check(). Replaced it with assets.Settlement.get_story_events() and assets.Settlement.update_timeline_with_story_events()
  • Decreased the numbers of calls to assets.Settlement.update_mins() by about 50% on each settlement render method. Should help page load times a smidge on Settlement Sheet and Campaign View.
  • Feature: Survivor Sheets for Settlements that innovate "Partnership" now have controls for selecting partners. Selecting a partner updates both survivors in mdb. Added get_partner() and update_partner() methods to assets.Survivor.
  • Survival Limit is no longer enforced when the "Beta Challenge Scenarios" expansion content is enabled. The expansion has a special rule that pops up in the Campaign Summary view.
  • Sunstalker: refactored the logic in assets.Settlement.get_timeline() that creates drop-downs for adding nemesis events to remove hard-coding for the Watcher. game_assets.nemeses dict now supports the a key/value pair called 'add_to_timeline_controls_at' that is used to do this. Nemeses also support a 'campaign' key/value that makes them campaign-specific. The Sunstalker also uses all of this.
  • Feature: Survivor Sheets now feature expansion-specific attribute controls. For now, the Sunstalker expansion is the only expansion that uses these (for "Purified", "Sun Eater" and "Child of the Sun").

Coming Soon

  • GitHub release
  • Flower Knight
  • Graceful failures for bogus Hunting Party operations
  • Full compliment of increment/decrement "paddle" buttons at wide resolution.
  • Clicking on a Survivor picture will allow you to change it.
  • Cursed item controls on the Survivor Sheet?
  • Survivor hit locations as a modal/pop-up window?

No comments:

Post a Comment