[Dev Blog] Stonehearth Latest Branch Updated to develop-2081! ALPHA 8!

We’ve also found the root cause of our save game problems: the game is running out of memory. The ultimate fix is to move to a 64-bit binary, as well as do the best we can to minimize memory usage in the 32-bit version of the game. We’ve started this process, and will keep you guys in the loop as the work continues.

Well, this is a rather bad sign.

1 Like

Not great, but I guess that’s what alphas are for :stuck_out_tongue: .

3 Likes

Yes, but that’s precisely the point. If they run into serious memory issues this early, I wonder how far the game can grow. 64bit is widespread, but perhaps not widespread enough to make a game require it.

In the end, this could severely limit the size of everything again - up to the point where we’re looking at something the magnitude of SimCity 2013.

I suppose one way to fix this could be to majorly re-think save/load as a whole, although that’s not exactly pretty.

2 Likes

There’s also potential ways to rethink world generation, as currently a large portion of land is generated and kept active at once. They might be able to do a “Fog of War” that puts inactive areas out of play to limit processing and upkeep for the whole world.

Plus, the pathfinder is still pretty crazy, and it’s likely taking more memory than it’ll need in the future…

2 Likes

For anyone who’s curious here’s a diff of the manifest from the last release to this one. Most of the changes are pretty expected if you’ve followed development of this alpha, but there’s also some other kind of interesting stuff in there like the permanently_harvest_entity ability.

-"mixins:placed_properties" : "file(mixins/placed_properties)",
+      "mixins:placed_properties" : "file(mixins/placed_properties)",
+      "blacksmith:workbench" : "file(jobs/blacksmith/blacksmith_workbench)",
+      "blacksmith:forge" : "file(jobs/blacksmith/blacksmith_forge)",
+      "blacksmith:outfit" : "file(jobs/blacksmith/blacksmith_outfit)",
+      "blacksmith:hammer" : "file(jobs/blacksmith/blacksmith_hammer)",
+      "blacksmith:talisman" : "file(jobs/blacksmith/blacksmith_hammer/blacksmith_hammer_talisman.json)",
+
+      "interval_data" : "file(services/server/interval/data/interval_data.json)",
+
+      "weaver:spinning_wheel" : "file(jobs/weaver/weaver_spinning_wheel/weaver_spinning_wheel.json)",
+      "weaver:loom" : "file(jobs/weaver/weaver_loom/weaver_loom.json)",
+      "monsters:goblins:skull_stake" : "file(entities/monsters/goblins/decoration/skull_stake)",
+      "monsters:goblins:banner" : "file(entities/monsters/goblins/decoration/banner)",
+      "resources:coal:lump_of_coal" : "file(entities/resources/coal/lump_of_coal)",
+      "resources:iron:ore" : "file(entities/resources/iron/iron_ore)",
+      "resources:copper:ore" : "file(entities/resources/copper/copper_ore)",
+      "resources:gold:ore" : "file(entities/resources/gold/gold_ore)",
+      "resources:silver:ore" : "file(entities/resources/silver/silver_ore)",
+      "resources:tin:ore" : "file(entities/resources/tin/tin_ore)",
+      "refined:copper_ingot" : "file(entities/refined/copper_ingot)",
+      "refined:tin_ingot" : "file(entities/refined/tin_ingot)",
+      "refined:iron_ingot" : "file(entities/refined/iron_ingot)",
+      "refined:gold_ingot" : "file(entities/refined/gold_ingot)",
+      "refined:silver_ingot" : "file(entities/refined/silver_ingot)",
+      "refined:steel_ingot" : "file(entities/refined/steel_ingot)",
+      "refined:bronze_ingot" : "file(entities/refined/bronze_ingot)",
+      "decoration:wooden_sign_blacksmith" : "file(entities/decoration/wooden_sign_blacksmith)",
+      "decoration:firepit" : "file(entities/decoration/firepit)",
+      "decoration:firepit_seat" : "file(entities/decoration/firepit/firepit_seat.json)",
+      "decoration:firepit_skulls" : "file(entities/decoration/firepit_skulls)",
+      "decoration:loot_chest" : "file(entities/decoration/loot_chest)",
+      "decoration:crate" : "file(entities/decoration/crate)",
+      "attack_order_banner" : "file(entities/gizmos/control_attack_banner)",
+      "defend_order_banner" : "file(entities/gizmos/control_defend_banner)",
-      "firepit" : "file(entities/gizmos/firepit)",
-      "firepit_seat" : "file(entities/gizmos/firepit/firepit_seat.json)",
+      "armor:bronze_breastplate" : "file(entities/armor/bronze_breastplate)",
+      "armor:iron_mail" : "file(entities/armor/iron_mail)",
+      "armor:steel_mail" : "file(entities/armor/steel_mail)",
+      "weapons:stone_maul" : "file(entities/weapons/stone_maul)",
+      "weapons:iron_mace" : "file(entities/weapons/iron_mace)",
+      "weapons:iron_pike" : "file(entities/weapons/iron_pike)",
+      "weapons:bronze_mace" : "file(entities/weapons/bronze_mace)",
+      "weapons:bronze_sword" : "file(entities/weapons/bronze_sword)",
+      "weapons:short_sword" : "file(entities/weapons/short_sword)",
+      "weapons:long_sword" : "file(entities/weapons/long_sword)",
+      "buffs:shepherd:speed_1" : "file(data/buffs/shepherding/shepherding_speed_bonus.json)",
+      "actions:smash_item" : "file(ai/actions/smash_item_action.lua)",
+      "actions:smash_item_adjacent" : "file(ai/actions/smash_item_adjacent_action.lua)",
+      "actions:choose_item_in_stockpile" : "file(ai/actions/choose_item_in_stockpile_action.lua)",
-      "actions:urgent_actions:dispatcher" : "file(ai/actions/urgent_actions/urgent_actions_dispatcher.lua)",
-      "actions:simple_labor_task_dispatcher" : "file(ai/actions/simple_labor_task_dispatcher.lua)",
+      "actions:party:destroy_items_in_stockpile" : "file(ai/actions/party/destroy_items_in_stockpile_action.lua)",
+
+      "sounds:ui:mason_menu:menu_open" : "file(data/sounds/ui/carpenter_menu/sh_mason_menu_open.wav)",
+      "sounds:ui:weaver_menu:menu_open" : "file(data/sounds/ui/carpenter_menu/sh_weaver_menu_open.wav)",
+      "sounds:ui:blacksmith_menu:menu_open" : "file(data/sounds/ui/carpenter_menu/sh_blacksmith_menu_open.wav)",
+      "sounds:ui:immigration_menu:immigration_pass" : "file(data/sounds/ui/immigration_menu/sh_ui_immigration_pass.wav)",
+      "sounds:ui:immigration_menu:immigration_fail" : "file(data/sounds/ui/immigration_menu/sh_ui_immigration_fail.wav)",
+      "sounds:ui:immigration_menu:immigration_negative" : "file(data/sounds/ui/immigration_menu/sh_ui_immigration_negative.wav)",
+      "sounds:ui:immigration_menu:immigration_positive" : "file(data/sounds/ui/immigration_menu/sh_ui_immigration_positive.wav)",
+
+      "sounds:mason_bench" : "file(data/sounds/effects/sh_mason_bench.wav)",
+      "sounds:blacksmith_bench" : "file(data/sounds/effects/sh_blacksmith_bench.wav)",
+      "sounds:mason_hammer_01" : "file(data/sounds/effects/sh_mason_hammer_01.wav)",
+      "sounds:mason_hammer_02" : "file(data/sounds/effects/sh_mason_hammer_02.wav)",
+      "sounds:mason_hammer_03" : "file(data/sounds/effects/sh_mason_hammer_03.wav)",
+      "sounds:blacksmith_hammer_01" : "file(data/sounds/effects/sh_blacksmith_hammer_01.wav)",
+      "sounds:blacksmith_hammer_02" : "file(data/sounds/effects/sh_blacksmith_hammer_02.wav)",
+      "sounds:blacksmith_hammer_03" : "file(data/sounds/effects/sh_blacksmith_hammer_03.wav)",
+
+      "data:npc_index" : "file(data/npc_index.json)",
+      "data:gm_index" : "file(data/gm/gm_index.json)",
+
+      "npc_jobs:peon" : "file(npc_jobs/peon/peon_description.json)",
+
+      "bulletins:goblin_thief" : "file(bulletins/goblin_thief.json)",
-      "bulletins:goblin_thief" : "file(bulletins/goblin_thief.json)"
+      "party:party_abilities" : "file(services/server/unit_control/entities/party_abilities.json)"
+       "permanently_harvest_entity" : {
+         "controller": "file(call_handlers/resource_call_handler.lua)",
+         "endpoint" : "server"
+      },
+      },
+      "set_time": {
+         "controller" : "file(call_handlers/calendar_call_handler.lua)",
+         "endpoint" : "server"
+      },
+      "cl_set_time": {
+         "controller" : "file(call_handlers/calendar_call_handler.lua)",
+         "endpoint" : "client"
+      "class:blacksmith" : "file(jobs/blacksmith/blacksmith.lua)",
+      "class:peon" : "file(npc_jobs/peon/peon.lua)",
+
-      "farmer_crop" : "file(components/farmer_field/farmer_crop.lua)"
+      "farmer_crop" : "file(components/farmer_field/farmer_crop.lua)",
+
+      "game_master:nodelist" : "file(services/server/game_master/controllers/nodelist.lua)",
+      "game_master:campaign" : "file(services/server/game_master/controllers/campaign.lua)",
+      "game_master:arc" : "file(services/server/game_master/controllers/arc.lua)",
+      "game_master:encounter" : "file(services/server/game_master/controllers/encounter.lua)",
+      "game_master:encounters:create_camp" : "file(services/server/game_master/controllers/encounters/create_camp.lua)",
+      "game_master:encounters:demand_tribute" : "file(services/server/game_master/controllers/encounters/demand_tribute.lua)",
+      "game_master:encounters:city_raid" : "file(services/server/game_master/controllers/encounters/city_raid.lua)",
+      "game_master:missions:raid_stockpiles" : "file(services/server/game_master/controllers/missions/raid_stockpiles_mission.lua)",
+
+      "unit_control:controller" : "file(services/server/unit_control/unit_controller.lua)",
+      "unit_control:party" : "file(services/server/unit_control/party.lua)"
-      "stacks_model_renderer" : "file(components/stacks_model_renderer/stacks_model_renderer_component.lua)"
+      "stacks_model_renderer" : "file(components/stacks_model_renderer/stacks_model_renderer_component.lua)",
+      "party_member" : "file(components/party_member/party_member_component.lua)"
+         "file(ui/game/parties/parties.html)",
+         "file(ui/game/party_editor/party_editor.html)",
+         "file(ui/game/bulletin/bulletin_dialog/immigration_report_dialog/immigration_report_dialog.html)",
+         "file(ui/game/bulletin/bulletin_dialog/demand_tribute_bulletin_dialog/demand_tribute_bulletin_dialog.html)",
+         "file(ui/game/parties/parties.js)",
+         "file(ui/game/party_editor/party_editor.js)",
+         "file(ui/game/bulletin/bulletin_dialog/immigration_report_dialog/immigration_report_dialog.js)",
+         "file(ui/game/bulletin/bulletin_dialog/demand_tribute_bulletin_dialog/demand_tribute_bulletin_dialog.js)",
+         "file(jobs/blacksmith/skin/workshop.less)",
+         "file(ui/game/parties/parties.less)",
+         "file(ui/game/party_editor/party_editor.less)",
+         "file(ui/game/bulletin/bulletin_dialog/immigration_report_dialog/immigration_report_dialog.less)",
+         "file(ui/game/bulletin/bulletin_dialog/demand_tribute_bulletin_dialog/demand_tribute_bulletin_dialog.less)",
2 Likes

Memory issues were the fatal clog in most Dwarf Fortress games too, even with DF’s ASCII graphics, as more and more crafted items get generated, more settlers join, etc. This type of sim game gets extremely memory-intensive.

1 Like

I don’t know exaxtly when it happened (at some point within the last two weeks I think?), but all “characters formerly known as citizens” are now called Hearthlings ingame. Cute, cool, and I like it. But it’s very hard to translate in a good way :wink:

Oh, and both description and help has same text. Perhaps ok, I don’t know. Looked fun when doing the translation.

"shepherd_zone_tip_description" : "Shepherds bring animals to this region and tend to their needs here.", 
"pasture_help" : "Shepherds bring animals to this region and tend to their needs here.", 
2 Likes

Translation sometimes mean adaptation. And it’s the worst part. Not being able to translate jokes or names like that.


I wonder if the long forgotten tall grass will be used in pastures, to feed the animals. Pets use to steal your food, so why not. It might have been its original purpose.

2 Likes

I think it’s really hard to be honest, and the reason is probably that I want to make a perfect translation to keep both charm and meaning, as well as the joke. Team Radiant seems to love funny wording luckily… The 30 different loding_map tags are still not translated in my translation file - and they have been there from the very start! :tired_face:

1 Like