Quite a bit more work on the goal system.

This commit is contained in:
Storm Dragon
2026-06-25 02:41:09 -04:00
parent 8219ab793f
commit aa866ba83d
25 changed files with 706 additions and 121 deletions
+3
View File
@@ -16,6 +16,7 @@ sound_pool p(300);
#include "src/enemies/bandit.nvgt" #include "src/enemies/bandit.nvgt"
#include "src/enemies/ground_game.nvgt" #include "src/enemies/ground_game.nvgt"
#include "src/enemies/flying_creatures.nvgt" #include "src/enemies/flying_creatures.nvgt"
#include "src/enemies/corpse_worm.nvgt"
#include "src/world/world_drops.nvgt" #include "src/world/world_drops.nvgt"
#include "src/world/world_snares.nvgt" #include "src/world/world_snares.nvgt"
#include "src/world/world_fires.nvgt" #include "src/world/world_fires.nvgt"
@@ -313,11 +314,13 @@ void run_game() {
update_bandits(); update_bandits();
update_boars(); update_boars();
update_flying_creatures(); update_flying_creatures();
update_corpse_worms();
update_weapon_range_audio_all(); update_weapon_range_audio_all();
update_world_drops(); update_world_drops();
update_pets(); update_pets();
update_blessings(); update_blessings();
update_notifications(); update_notifications();
update_goal_announcements();
// Fire damage check (only if not jumping) // Fire damage check (only if not jumping)
WorldFire @fire_on_tile = get_fire_at(x); WorldFire @fire_on_tile = get_fire_at(x);
-4
View File
@@ -11,10 +11,6 @@ Explore gather craft defend your base through the day and night cycle
chmod +x draugnorak chmod +x draugnorak
``` ```
### Android Note
- Android builds require an external keyboard (USB or Bluetooth)
- Touch controls are not implemented because too many game controls to do this in a good way for playability
## Quick Start ## Quick Start
- Move with Left or Right - Move with Left or Right
- Jump with Up - Jump with Up
+30 -3
View File
@@ -626,6 +626,7 @@ msg.096539f23463=Die oorlogstromme slaan! Berei voor vir geveg!
msg.09c28ae8f83b=Klippe msg.09c28ae8f83b=Klippe
msg.09d016686864=Stal nie gebou nie msg.09d016686864=Stal nie gebou nie
msg.0a3bdcef1906=Rietmandjies msg.0a3bdcef1906=Rietmandjies
msg.0a6e19e37b4d=nuwe doelwit
msg.0a9d6438c818==== Betowerde Melodie === msg.0a9d6438c818==== Betowerde Melodie ===
msg.0b3d8d5cdca6=- Bereik die basis en vernietig die barrikade msg.0b3d8d5cdca6=- Bereik die basis en vernietig die barrikade
msg.0bcd9af79f2d=woud msg.0bcd9af79f2d=woud
@@ -984,14 +985,25 @@ system.goals.completed.entry_one={goal}. 1 doelpunt toegeken.
system.goals.completed.none=Nog geen doelwitte voltooi nie. system.goals.completed.none=Nog geen doelwitte voltooi nie.
system.goals.completed.prompt=Voltooide doelwitte. {option} system.goals.completed.prompt=Voltooide doelwitte. {option}
system.goals.current=Huidige doelwit: {goal}. Onbestede doelpunte: {unspent}. system.goals.current=Huidige doelwit: {goal}. Onbestede doelpunte: {unspent}.
system.goals.new=Nuwe doelwit: {goal} Druk G om jou huidige doelwit te hersien.
system.goals.spend_hint=Om doelpunte te spandeer, druk P vir die karakterkieslys, kies dan Doelwitte en Bemeestering.
system.goals.goal.build_altar.name=Bou 'n altaar. system.goals.goal.build_altar.name=Bou 'n altaar.
system.goals.goal.build_firepit.name=Bou 'n vuurput. system.goals.goal.build_firepit.name=Bou 'n vuurput.
system.goals.goal.build_storage.name=Bou berging. system.goals.goal.build_storage.name=Bou berging.
system.goals.goal.complete_quest.name=Voltooi 'n soektog. system.goals.goal.complete_quest.name=Voltooi 'n soektog.
system.goals.goal.completed=Doelwit voltooi: {goal}. {points} doelpunte toegeken. system.goals.goal.completed=Doelwit voltooi: {goal}. 1 doelpunt toegeken.
system.goals.goal.craft_knife.name=Maak 'n mes. system.goals.goal.craft_knife.name=Maak 'n mes.
system.goals.goal.craft_spear.name=Maak 'n speer. system.goals.goal.craft_spear.name=Maak 'n speer.
system.goals.goal.engrave_rune.name=Grafeer 'n rune. system.goals.goal.engrave_rune.name=Grafeer 'n rune.
system.goals.goal.craft_axe.name=Maak 'n klipbyl.
system.goals.goal.chop_tree_1.name=Kap 'n boom af.
system.goals.goal.chop_tree_4.name=Kap 4 bome af.
system.goals.goal.chop_tree_9.name=Kap 9 bome af.
system.goals.goal.chop_tree_27.name=Kap 27 bome af.
system.goals.goal.craft_snare.name=Maak 'n strik.
system.goals.goal.catch_snare.name=Vang iets in 'n strik.
system.goals.goal.butcher_game.name=Slag wild.
system.goals.goal.craft_sling.name=Maak 'n slinger.
system.goals.goal.light_fire.name=Steek 'n vuur aan. system.goals.goal.light_fire.name=Steek 'n vuur aan.
system.goals.goal.unknown.name=Onbekende doelwit. system.goals.goal.unknown.name=Onbekende doelwit.
system.goals.goal.win_adventure.name=Wen 'n avontuur. system.goals.goal.win_adventure.name=Wen 'n avontuur.
@@ -1014,14 +1026,29 @@ system.goals.mastery.prompt=Bemeestering. {option}
system.goals.mastery.crafting.level1=Gemaakte basiese gereedskap is stewiger. system.goals.mastery.crafting.level1=Gemaakte basiese gereedskap is stewiger.
system.goals.mastery.crafting.level2=Ontsluit groot speer resep. system.goals.mastery.crafting.level2=Ontsluit groot speer resep.
system.goals.mastery.crafting.level3=Groot speer bereik 2 teëls maar het 'n stadiger aanvalsvenster. system.goals.mastery.crafting.level3=Groot speer bereik 2 teëls maar het 'n stadiger aanvalsvenster.
system.goals.mastery.crafting.level4=Persoonlike gereedskap, wapens en klere slyt nie meer uit nie.
system.goals.mastery.crafting.name=Handwerk Bemeestering system.goals.mastery.crafting.name=Handwerk Bemeestering
system.goals.mastery.leadership.level1=Inwoners is versigtig en breek minder gereedskap en wapens.
system.goals.mastery.leadership.level2=Inwoners is georganiseer en slaag meer gereeld met werk.
system.goals.mastery.leadership.level3=Inwoners tree vinniger op tydens verdediging en dringende werk.
system.goals.mastery.leadership.level4=Inwoners rantsoeneer kos en eet elke 12 uur in plaas van elke 8.
system.goals.mastery.leadership.name=Leierskap Bemeestering
system.goals.mastery.taming.level1=Troeteldiere kan gevalle items haal.
system.goals.mastery.taming.level2=Troeteldiere is sterker en kry een maksimum gesondheid.
system.goals.mastery.taming.level3=Troeteldiere herstel vinniger van bewusteloosheid.
system.goals.mastery.taming.level4=Gebonde troeteldiere benodig nie meer kos nie en bly ten volle lojaal.
system.goals.mastery.taming.name=Tem Bemeestering
system.goals.mastery.unknown.name=Onbekende bemeestering system.goals.mastery.unknown.name=Onbekende bemeestering
system.goals.mastery.unknown_level=Onbekende ontgrendeling system.goals.mastery.unknown_level=Onbekende ontgrendeling
system.goals.mastery.maxed=Handwerk Bemeestering: maks bereik system.goals.mastery.maxed={category}: maks bereik
system.goals.mastery.summary={category} vlak {level} van {max}. Volgende koste: {cost} doelpunte. system.goals.mastery.summary={category} vlak {level} van {max}. Volgende koste: {cost} doelpunte.
system.goals.mastery.unlocked=Ontgrendel {unlock}. system.goals.mastery.unlocked=Ontgrendel {unlock}.
system.goals.mastery.confirm=Spandeer {cost} doelpunte om {unlock} te ontgrendel? system.goals.mastery.confirm=Spandeer {cost} doelpunte om {unlock} te ontgrendel?
system.goals.mastery.already_maxed=Handwerk Bemeestering is reeds maks. system.goals.mastery.already_maxed={category} is reeds maks.
system.goals.mastery.not_enough_points=Benodig {cost} doelpunte. Jy het {unspent}. system.goals.mastery.not_enough_points=Benodig {cost} doelpunte. Jy het {unspent}.
system.goals.mastery.spend_failed=Kon nie die doelpunt spandeer nie. system.goals.mastery.spend_failed=Kon nie die doelpunt spandeer nie.
system.goals.menu.back=Terug system.goals.menu.back=Terug
msg.06c9fefbd6d7=lykwurm sterf
msg.c6d56016b910=lykwurm
msg.d2e0d305bc2b='n Swak kruipende vyand wat buite die basis begin verskyn na dag 1.
+54 -24
View File
@@ -233,9 +233,11 @@ character.info.goals=Goals: {unspent} unspent, {earned} earned
character.info.goals_menu=Goals character.info.goals_menu=Goals
character.word.hour=hour character.word.hour=hour
character.word.hours=hours character.word.hours=hours
goals.new=New goal: {goal} Press G to review your current goal.
goals.current=Current goal: {goal}. Unspent goal points: {unspent}. goals.current=Current goal: {goal}. Unspent goal points: {unspent}.
goals.all_complete=All current goals complete. Unspent goal points: {unspent}. goals.all_complete=All current goals complete. Unspent goal points: {unspent}.
goals.goal.completed=Goal complete: {goal}. Awarded {points} goal points. goals.spend_hint=To spend goal points, press P for the character menu, then choose Goals and Mastery.
goals.goal.completed=Goal complete: {goal}. Awarded 1 goal point.
goals.reward.one=Reward: 1 goal point. goals.reward.one=Reward: 1 goal point.
goals.reward.many=Reward: {count} goal points. goals.reward.many=Reward: {count} goal points.
goals.goal.craft_knife.name=Craft a knife. goals.goal.craft_knife.name=Craft a knife.
@@ -247,6 +249,15 @@ goals.goal.build_altar.name=Build an altar.
goals.goal.complete_quest.name=Complete a quest. goals.goal.complete_quest.name=Complete a quest.
goals.goal.win_adventure.name=Win an adventure. goals.goal.win_adventure.name=Win an adventure.
goals.goal.engrave_rune.name=Engrave a rune. goals.goal.engrave_rune.name=Engrave a rune.
goals.goal.craft_axe.name=Craft a stone axe.
goals.goal.chop_tree_1.name=Chop down a tree.
goals.goal.chop_tree_4.name=Chop down 4 trees.
goals.goal.chop_tree_9.name=Chop down 9 trees.
goals.goal.chop_tree_27.name=Chop down 27 trees.
goals.goal.craft_snare.name=Craft a snare.
goals.goal.catch_snare.name=Catch something in a snare.
goals.goal.butcher_game.name=Butcher game.
goals.goal.craft_sling.name=Craft a sling.
goals.goal.unknown.name=Unknown goal. goals.goal.unknown.name=Unknown goal.
goals.menu.prompt=Goals. {option} goals.menu.prompt=Goals. {option}
goals.menu.current=Current goal: {goal} goals.menu.current=Current goal: {goal}
@@ -264,18 +275,29 @@ goals.completed.entry_one={goal}. Awarded 1 goal point.
goals.completed.entry_many={goal}. Awarded {points} goal points. goals.completed.entry_many={goal}. Awarded {points} goal points.
goals.mastery.prompt=Mastery. {option} goals.mastery.prompt=Mastery. {option}
goals.mastery.crafting.name=Crafting Mastery goals.mastery.crafting.name=Crafting Mastery
goals.mastery.leadership.name=Leadership Mastery
goals.mastery.taming.name=Taming Mastery
goals.mastery.unknown.name=Unknown mastery goals.mastery.unknown.name=Unknown mastery
goals.mastery.unknown_level=Unknown unlock goals.mastery.unknown_level=Unknown unlock
goals.mastery.maxed=Crafting Mastery: maxed out goals.mastery.maxed={category}: maxed out
goals.mastery.summary={category} level {level} of {max}. Next cost: {cost} goal points. goals.mastery.summary={category} level {level} of {max}. Next cost: {cost} goal points.
goals.mastery.unlocked=Unlocked {unlock}. goals.mastery.unlocked=Unlocked {unlock}.
goals.mastery.confirm=Spend {cost} goal points to unlock {unlock}? goals.mastery.confirm=Spend {cost} goal points to unlock {unlock}?
goals.mastery.already_maxed=Crafting Mastery is already maxed out. goals.mastery.already_maxed={category} is already maxed out.
goals.mastery.not_enough_points=Need {cost} goal points. You have {unspent}. goals.mastery.not_enough_points=Need {cost} goal points. You have {unspent}.
goals.mastery.spend_failed=Could not spend the goal point. goals.mastery.spend_failed=Could not spend the goal point.
goals.mastery.crafting.level1=Crafted basic tools are sturdier. goals.mastery.crafting.level1=Crafted basic tools are sturdier.
goals.mastery.crafting.level2=Unlock great spear recipe. goals.mastery.crafting.level2=Unlock great spear recipe.
goals.mastery.crafting.level3=Great spear reaches 2 tiles but has a slower attack window. goals.mastery.crafting.level3=Great spear reaches 2 tiles but has a slower attack window.
goals.mastery.crafting.level4=Personal tools, weapons, and clothing no longer wear out.
goals.mastery.leadership.level1=Residents are careful and break fewer tools and weapons.
goals.mastery.leadership.level2=Residents are organized and succeed at work more often.
goals.mastery.leadership.level3=Residents act faster during defense and urgent work.
goals.mastery.leadership.level4=Residents ration food, eating every 12 hours instead of every 8.
goals.mastery.taming.level1=Pets can retrieve dropped items.
goals.mastery.taming.level2=Pets are heartier and gain one maximum health.
goals.mastery.taming.level3=Pets recover from knockout faster.
goals.mastery.taming.level4=Bonded pets no longer require food and stay fully loyal.
crafting.weapons.option.great_spear=Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2] crafting.weapons.option.great_spear=Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2]
crafting.weapons.crafted.great_spear=Crafted a Great Spear. crafting.weapons.crafted.great_spear=Crafted a Great Spear.
crafting.weapons.great_spear.requires_mastery=Great spear requires Crafting Mastery 2. crafting.weapons.great_spear.requires_mastery=Great spear requires Crafting Mastery 2.
@@ -670,7 +692,7 @@ msg.03268c7d7239=backpacks
msg.03976920927e=rope msg.03976920927e=rope
; src/item_registry.nvgt:item_display:small_game ; src/item_registry.nvgt:item_display:small_game
msg.0406529811c7=Small Game msg.0406529811c7=Small Game
; draugnorak.nvgt:653:ui_info_box[2] ; draugnorak.nvgt:656:ui_info_box[2]
msg.041d8413712d=A crash log was written to your save data folder. msg.041d8413712d=A crash log was written to your save data folder.
; seed:learn_sounds_label:sounds/enemies/vampyr1.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr1.ogg
msg.04a8916a9494=vampyr1 msg.04a8916a9494=vampyr1
@@ -678,6 +700,8 @@ msg.04a8916a9494=vampyr1
msg.0532db2192fa=incense msg.0532db2192fa=incense
; src/bosses/bandit_hideout.nvgt:787:insert_last[0] ; src/bosses/bandit_hideout.nvgt:787:insert_last[0]
msg.066723a92e94==== Victory Rewards === msg.066723a92e94==== Victory Rewards ===
; seed:learn_sounds_label:sounds/enemies/corpse_worm_dies.ogg
msg.06c9fefbd6d7=corpse worm dies
; src/quests/enchanted_melody_game.nvgt:36:insert_last[0] ; src/quests/enchanted_melody_game.nvgt:36:insert_last[0]
msg.07e9ab246cdd=After closing this screen, you can practice the notes. msg.07e9ab246cdd=After closing this screen, you can practice the notes.
; src/item_registry.nvgt:item_plural:sinew ; src/item_registry.nvgt:item_plural:sinew
@@ -690,6 +714,8 @@ msg.09c28ae8f83b=Stones
msg.09d016686864=Stable not built msg.09d016686864=Stable not built
; src/item_registry.nvgt:item_display:reed_baskets ; src/item_registry.nvgt:item_display:reed_baskets
msg.0a3bdcef1906=Reed Baskets msg.0a3bdcef1906=Reed Baskets
; seed:learn_sounds_label:sounds/new_goal.ogg
msg.0a6e19e37b4d=new goal
; src/quests/enchanted_melody_game.nvgt:26:insert_last[0] ; src/quests/enchanted_melody_game.nvgt:26:insert_last[0]
msg.0a9d6438c818==== Enchanted Melody === msg.0a9d6438c818==== Enchanted Melody ===
; src/bosses/bandit_hideout.nvgt:305:insert_last[0] ; src/bosses/bandit_hideout.nvgt:305:insert_last[0]
@@ -736,7 +762,7 @@ msg.18b837bb6f43=bat1
msg.18c77e824a2a=yeti dies msg.18c77e824a2a=yeti dies
; seed:learn_sounds_label:sounds/enemies/bandit_dies.ogg ; seed:learn_sounds_label:sounds/enemies/bandit_dies.ogg
msg.1a853cbfbc36=bandit dies msg.1a853cbfbc36=bandit dies
; src/sound_settings.nvgt:48:learn_sounds_add_description[1] ; src/sound_settings.nvgt:50:learn_sounds_add_description[1]
msg.1bb8ef2886a3=Basic undead. msg.1bb8ef2886a3=Basic undead.
; seed:learn_sounds_label:sounds/nature/night.ogg ; seed:learn_sounds_label:sounds/nature/night.ogg
msg.1be2a44cb53d=night msg.1be2a44cb53d=night
@@ -878,7 +904,7 @@ msg.444d4678962b=falling
msg.4537c16badd9=bow fire msg.4537c16badd9=bow fire
; src/item_registry.nvgt:item_plural:snares ; src/item_registry.nvgt:item_plural:snares
msg.455b11a16eb7=snares msg.455b11a16eb7=snares
; src/sound_settings.nvgt:38:learn_sounds_add_description[1] ; src/sound_settings.nvgt:40:learn_sounds_add_description[1]
msg.4671b16b0398=Not quite a zombie nor a vampyr. These undead remember they used to have a home, and maybe there's food there... msg.4671b16b0398=Not quite a zombie nor a vampyr. These undead remember they used to have a home, and maybe there's food there...
; seed:learn_sounds_label:sounds/terrain/draugrhaugr_step.ogg ; seed:learn_sounds_label:sounds/terrain/draugrhaugr_step.ogg
msg.46fcdd91c99e=draugrhaugr step msg.46fcdd91c99e=draugrhaugr step
@@ -916,13 +942,13 @@ msg.5009c8e190ee=turkey
msg.508e8bc0cc57=- Use Up/Down to change the number msg.508e8bc0cc57=- Use Up/Down to change the number
; seed:learn_sounds_label:sounds/weapons/sling_low_range.ogg ; seed:learn_sounds_label:sounds/weapons/sling_low_range.ogg
msg.5123c22ce6a5=sling low range msg.5123c22ce6a5=sling low range
; draugnorak.nvgt:112:insert_last[0] ; draugnorak.nvgt:113:insert_last[0]
msg.528fb1c4e5fb=New Game msg.528fb1c4e5fb=New Game
; seed:learn_sounds_label:sounds/quests/squish.ogg ; seed:learn_sounds_label:sounds/quests/squish.ogg
msg.5460f2e3c43e=squish msg.5460f2e3c43e=squish
; seed:learn_sounds_label:sounds/actions/fishpole_break.ogg ; seed:learn_sounds_label:sounds/actions/fishpole_break.ogg
msg.546330ee64db=fishpole break msg.546330ee64db=fishpole break
; draugnorak.nvgt:653:ui_info_box[0] ; draugnorak.nvgt:656:ui_info_box[0]
msg.54fc2d657ed6=Draugnorak msg.54fc2d657ed6=Draugnorak
; seed:learn_sounds_label:sounds/enemies/vampyr3.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr3.ogg
msg.55748cf43121=vampyr3 msg.55748cf43121=vampyr3
@@ -950,7 +976,7 @@ msg.5cac31311668=Pasture is full. No livestock were recovered.
msg.5cc7429297c8=that can be destroyed with an axe. msg.5cc7429297c8=that can be destroyed with an axe.
; seed:learn_sounds_label:sounds/actions/cast_strength.ogg ; seed:learn_sounds_label:sounds/actions/cast_strength.ogg
msg.5dfc869b7588=cast strength msg.5dfc869b7588=cast strength
; src/time_system.nvgt:794:notify[0] ; src/time_system.nvgt:801:notify[0]
msg.5ea84b1201bb={arg1} favor grants you the eyes of an eagle. msg.5ea84b1201bb={arg1} favor grants you the eyes of an eagle.
; seed:learn_sounds_label:sounds/menu/menu_select.ogg ; seed:learn_sounds_label:sounds/menu/menu_select.ogg
; seed:learn_sounds_label:sounds/menu.bak/menu_select.ogg ; seed:learn_sounds_label:sounds/menu.bak/menu_select.ogg
@@ -1034,8 +1060,8 @@ msg.7e83de91b4a2=bandit female dies
msg.7f7e3bbf8864=An enemy is no longer in range of your currently wielded weapon. msg.7f7e3bbf8864=An enemy is no longer in range of your currently wielded weapon.
; src/item_registry.nvgt:item_display:backpacks ; src/item_registry.nvgt:item_display:backpacks
msg.7fae743693f4=Backpacks msg.7fae743693f4=Backpacks
; draugnorak.nvgt:231:ui_info_box[1] ; draugnorak.nvgt:232:ui_info_box[1]
; draugnorak.nvgt:245:ui_info_box[1] ; draugnorak.nvgt:246:ui_info_box[1]
msg.802aa6576577=Load Game msg.802aa6576577=Load Game
; src/item_registry.nvgt:item_plural:sticks ; src/item_registry.nvgt:item_plural:sticks
msg.803e4c41bbd2=sticks msg.803e4c41bbd2=sticks
@@ -1044,12 +1070,12 @@ msg.803e4c41bbd2=sticks
msg.80655da8d80a=tree msg.80655da8d80a=tree
; src/item_registry.nvgt:item_plural:canoes ; src/item_registry.nvgt:item_plural:canoes
msg.806baaf8e039=canoes msg.806baaf8e039=canoes
; src/time_system.nvgt:776:notify[0] ; src/time_system.nvgt:783:notify[0]
; src/time_system.nvgt:786:notify[0] ; src/time_system.nvgt:793:notify[0]
msg.81df04a81e24={arg1} favor shines upon you. {arg2} msg.81df04a81e24={arg1} favor shines upon you. {arg2}
; src/quests/catch_the_boomerang_game.nvgt:22:insert_last[0] ; src/quests/catch_the_boomerang_game.nvgt:22:insert_last[0]
msg.823be948275f=- Better timing earns more points (up to 4) msg.823be948275f=- Better timing earns more points (up to 4)
; src/sound_settings.nvgt:41:learn_sounds_add_description[1] ; src/sound_settings.nvgt:43:learn_sounds_add_description[1]
msg.83865f248682=More powerful undead. They do not lose track of you when you are in the base. msg.83865f248682=More powerful undead. They do not lose track of you when you are in the base.
; seed:learn_sounds_label:sounds/nature/wind_high.ogg ; seed:learn_sounds_label:sounds/nature/wind_high.ogg
msg.8443de859917=wind high msg.8443de859917=wind high
@@ -1071,7 +1097,7 @@ msg.86e257c3efcb=Oldest notification. {arg1}
msg.87383ce4344d=Bowstrings msg.87383ce4344d=Bowstrings
; src/item_registry.nvgt:item_plural:ropes ; src/item_registry.nvgt:item_plural:ropes
msg.87cdb5c91437=ropes msg.87cdb5c91437=ropes
; src/time_system.nvgt:790:notify[0] ; src/time_system.nvgt:797:notify[0]
msg.8818f1d55166={arg1} radiance fills residents with purpose. msg.8818f1d55166={arg1} radiance fills residents with purpose.
; src/quests/bat_invasion_game.nvgt:7:insert_last[0] ; src/quests/bat_invasion_game.nvgt:7:insert_last[0]
msg.88749dbbbf09==== Bat Invasion === msg.88749dbbbf09==== Bat Invasion ===
@@ -1089,7 +1115,7 @@ msg.8f993ac20023=You enter a narrow mountain pass. A massive Unicorn blocks your
msg.917ee46db0cd=bee msg.917ee46db0cd=bee
; seed:learn_sounds_label:sounds/player_male_damage.ogg ; seed:learn_sounds_label:sounds/player_male_damage.ogg
msg.924e0eb6b6f1=player male damage msg.924e0eb6b6f1=player male damage
; src/time_system.nvgt:781:notify[0] ; src/time_system.nvgt:788:notify[0]
msg.9281d2fe5f08={arg1} favor shines upon you. You feel swift for a while. msg.9281d2fe5f08={arg1} favor shines upon you. You feel swift for a while.
; seed:learn_sounds_label:sounds/actions/climb_rope.ogg ; seed:learn_sounds_label:sounds/actions/climb_rope.ogg
msg.92abc6d6953f=climb rope msg.92abc6d6953f=climb rope
@@ -1140,9 +1166,9 @@ msg.a3cb738850fa=wolf
msg.a3f2439ef01a=skin hat msg.a3f2439ef01a=skin hat
; seed:learn_sounds_label:sounds/quests/bone1.ogg ; seed:learn_sounds_label:sounds/quests/bone1.ogg
msg.a56be51786dc=bone1 msg.a56be51786dc=bone1
; src/sound_settings.nvgt:43:learn_sounds_add_description[1]
; src/sound_settings.nvgt:44:learn_sounds_add_description[1]
; src/sound_settings.nvgt:45:learn_sounds_add_description[1] ; src/sound_settings.nvgt:45:learn_sounds_add_description[1]
; src/sound_settings.nvgt:46:learn_sounds_add_description[1]
; src/sound_settings.nvgt:47:learn_sounds_add_description[1]
msg.a570b024087d=Ever hungry, they feed upon your residents. msg.a570b024087d=Ever hungry, they feed upon your residents.
; src/quests/escape_from_hel_game.nvgt:15:insert_last[0] ; src/quests/escape_from_hel_game.nvgt:15:insert_last[0]
msg.a641f39a6317=- The run ends when you fall into a grave msg.a641f39a6317=- The run ends when you fall into a grave
@@ -1218,7 +1244,7 @@ msg.c01409b3a728=When casting release control when over water. When catching rel
msg.c05feaca7269=No items were recovered. msg.c05feaca7269=No items were recovered.
; src/item_registry.nvgt:item_singular:snare ; src/item_registry.nvgt:item_singular:snare
msg.c1104d82c0bd=snare msg.c1104d82c0bd=snare
; src/sound_settings.nvgt:37:learn_sounds_add_description[1] ; src/sound_settings.nvgt:39:learn_sounds_add_description[1]
msg.c48d642737b2=Inhabits mountainous regions. msg.c48d642737b2=Inhabits mountainous regions.
; src/item_registry.nvgt:item_display:smoked_fish ; src/item_registry.nvgt:item_display:smoked_fish
msg.c4f7e9c21601=Smoked Fish msg.c4f7e9c21601=Smoked Fish
@@ -1228,6 +1254,8 @@ msg.c50641e24962=Your cast missed the water and landed in nearby foliage where i
msg.c52888225c69=fall msg.c52888225c69=fall
; seed:learn_sounds_label:sounds/enemies/bandit1.ogg ; seed:learn_sounds_label:sounds/enemies/bandit1.ogg
msg.c65e5dfc5ba7=bandit1 msg.c65e5dfc5ba7=bandit1
; seed:learn_sounds_label:sounds/enemies/corpse_worm.ogg
msg.c6d56016b910=corpse worm
; src/bosses/bandit_hideout.nvgt:789:insert_last[0] ; src/bosses/bandit_hideout.nvgt:789:insert_last[0]
msg.c72b7844929d=Bandits defeated: {arg1}. msg.c72b7844929d=Bandits defeated: {arg1}.
; seed:learn_sounds_label:sounds/terrain/stream.ogg ; seed:learn_sounds_label:sounds/terrain/stream.ogg
@@ -1259,7 +1287,7 @@ msg.ce3897c6b3be={arg1}: {arg2}
; seed:learn_sounds_label:sounds/items/item_breaks.ogg ; seed:learn_sounds_label:sounds/items/item_breaks.ogg
msg.ce5aeca95fb9=item breaks msg.ce5aeca95fb9=item breaks
; src/i18n.nvgt:677:speak_with_history[0] ; src/i18n.nvgt:677:speak_with_history[0]
; src/pet_system.nvgt:926:speak_with_history[0] ; src/pet_system.nvgt:935:speak_with_history[0]
; src/save_system.nvgt:344:speak_with_history[0] ; src/save_system.nvgt:344:speak_with_history[0]
msg.cea88b214070={arg1} {arg2} msg.cea88b214070={arg1} {arg2}
; seed:manual ; seed:manual
@@ -1268,11 +1296,13 @@ msg.cfe2650b4c6e=Found a stone.
msg.d04a59a6a71b=Controls: LEFT/RIGHT to move, UP to jump, CTRL to attack, ESC to flee msg.d04a59a6a71b=Controls: LEFT/RIGHT to move, UP to jump, CTRL to attack, ESC to flee
; src/item_registry.nvgt:item_singular:skin ; src/item_registry.nvgt:item_singular:skin
msg.d0cb2acd0739=skin msg.d0cb2acd0739=skin
; src/sound_settings.nvgt:37:learn_sounds_add_description[1]
msg.d2e0d305bc2b=A weak crawling enemy that starts appearing outside the base after day 1.
; seed:learn_sounds_label:sounds/enemies/enemy_falls.ogg ; seed:learn_sounds_label:sounds/enemies/enemy_falls.ogg
msg.d34b6217ea75=enemy falls msg.d34b6217ea75=enemy falls
; src/item_registry.nvgt:item_display:skin_gloves ; src/item_registry.nvgt:item_display:skin_gloves
msg.d373510877fd=Skin Gloves msg.d373510877fd=Skin Gloves
; draugnorak.nvgt:653:ui_info_box[1] ; draugnorak.nvgt:656:ui_info_box[1]
; seed:manual ; seed:manual
msg.d39008c4a392=Unhandled exception msg.d39008c4a392=Unhandled exception
; src/item_registry.nvgt:item_singular:backpack ; src/item_registry.nvgt:item_singular:backpack
@@ -1295,7 +1325,7 @@ msg.da0b5a461d98=F or K - First note (lowest pitch)
msg.da11dc5e090c=sling hit msg.da11dc5e090c=sling hit
; seed:learn_sounds_label:sounds/enemies/vampyr_dies.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr_dies.ogg
msg.da93fb9992a3=vampyr dies msg.da93fb9992a3=vampyr dies
; src/sound_settings.nvgt:47:learn_sounds_add_description[1] ; src/sound_settings.nvgt:49:learn_sounds_add_description[1]
msg.dadd68431e60=Inhabits snowy regions. msg.dadd68431e60=Inhabits snowy regions.
; seed:learn_sounds_label:sounds/enemies/exit_range.ogg ; seed:learn_sounds_label:sounds/enemies/exit_range.ogg
msg.db2a8514a0fc=exit range msg.db2a8514a0fc=exit range
@@ -1365,7 +1395,7 @@ msg.e7409fcb54bc=feed fire
msg.e8002c169040=wood msg.e8002c169040=wood
; src/quests/escape_from_hel_game.nvgt:13:insert_last[0] ; src/quests/escape_from_hel_game.nvgt:13:insert_last[0]
msg.e8216720d30b=- Press SPACE to jump over graves msg.e8216720d30b=- Press SPACE to jump over graves
; draugnorak.nvgt:132:insert_last[0] ; draugnorak.nvgt:133:insert_last[0]
msg.e8db3a42f86f=Learn Sounds msg.e8db3a42f86f=Learn Sounds
; src/bosses/bandit_hideout.nvgt:845:insert_last[0] ; src/bosses/bandit_hideout.nvgt:845:insert_last[0]
msg.e8e8f4ee7a5a=You can now engrave weapons with this rune at the crafting menu. msg.e8e8f4ee7a5a=You can now engrave weapons with this rune at the crafting menu.
@@ -1396,7 +1426,7 @@ msg.f3d964225e83=player female damage
msg.f5cabf873590=reed msg.f5cabf873590=reed
; src/bosses/bandit_hideout.nvgt:301:insert_last[0] ; src/bosses/bandit_hideout.nvgt:301:insert_last[0]
msg.f77fc018cb7b=You find a hidden bandit base deep in the forest. msg.f77fc018cb7b=You find a hidden bandit base deep in the forest.
; draugnorak.nvgt:148:insert_last[0] ; draugnorak.nvgt:149:insert_last[0]
msg.f83b6fe3aebf=Exit msg.f83b6fe3aebf=Exit
; src/inventory_items.nvgt:504:speak_with_history[0] ; src/inventory_items.nvgt:504:speak_with_history[0]
; src/quests/skeletal_bard_game.nvgt:26:speak_with_history[0] ; src/quests/skeletal_bard_game.nvgt:26:speak_with_history[0]
+54 -24
View File
@@ -233,9 +233,11 @@ character.info.goals=Goals: {unspent} unspent, {earned} earned
character.info.goals_menu=Goals character.info.goals_menu=Goals
character.word.hour=hour character.word.hour=hour
character.word.hours=hours character.word.hours=hours
goals.new=New goal: {goal} Press G to review your current goal.
goals.current=Current goal: {goal}. Unspent goal points: {unspent}. goals.current=Current goal: {goal}. Unspent goal points: {unspent}.
goals.all_complete=All current goals complete. Unspent goal points: {unspent}. goals.all_complete=All current goals complete. Unspent goal points: {unspent}.
goals.goal.completed=Goal complete: {goal}. Awarded {points} goal points. goals.spend_hint=To spend goal points, press P for the character menu, then choose Goals and Mastery.
goals.goal.completed=Goal complete: {goal}. Awarded 1 goal point.
goals.reward.one=Reward: 1 goal point. goals.reward.one=Reward: 1 goal point.
goals.reward.many=Reward: {count} goal points. goals.reward.many=Reward: {count} goal points.
goals.goal.craft_knife.name=Craft a knife. goals.goal.craft_knife.name=Craft a knife.
@@ -247,6 +249,15 @@ goals.goal.build_altar.name=Build an altar.
goals.goal.complete_quest.name=Complete a quest. goals.goal.complete_quest.name=Complete a quest.
goals.goal.win_adventure.name=Win an adventure. goals.goal.win_adventure.name=Win an adventure.
goals.goal.engrave_rune.name=Engrave a rune. goals.goal.engrave_rune.name=Engrave a rune.
goals.goal.craft_axe.name=Craft a stone axe.
goals.goal.chop_tree_1.name=Chop down a tree.
goals.goal.chop_tree_4.name=Chop down 4 trees.
goals.goal.chop_tree_9.name=Chop down 9 trees.
goals.goal.chop_tree_27.name=Chop down 27 trees.
goals.goal.craft_snare.name=Craft a snare.
goals.goal.catch_snare.name=Catch something in a snare.
goals.goal.butcher_game.name=Butcher game.
goals.goal.craft_sling.name=Craft a sling.
goals.goal.unknown.name=Unknown goal. goals.goal.unknown.name=Unknown goal.
goals.menu.prompt=Goals. {option} goals.menu.prompt=Goals. {option}
goals.menu.current=Current goal: {goal} goals.menu.current=Current goal: {goal}
@@ -264,18 +275,29 @@ goals.completed.entry_one={goal}. Awarded 1 goal point.
goals.completed.entry_many={goal}. Awarded {points} goal points. goals.completed.entry_many={goal}. Awarded {points} goal points.
goals.mastery.prompt=Mastery. {option} goals.mastery.prompt=Mastery. {option}
goals.mastery.crafting.name=Crafting Mastery goals.mastery.crafting.name=Crafting Mastery
goals.mastery.leadership.name=Leadership Mastery
goals.mastery.taming.name=Taming Mastery
goals.mastery.unknown.name=Unknown mastery goals.mastery.unknown.name=Unknown mastery
goals.mastery.unknown_level=Unknown unlock goals.mastery.unknown_level=Unknown unlock
goals.mastery.maxed=Crafting Mastery: maxed out goals.mastery.maxed={category}: maxed out
goals.mastery.summary={category} level {level} of {max}. Next cost: {cost} goal points. goals.mastery.summary={category} level {level} of {max}. Next cost: {cost} goal points.
goals.mastery.unlocked=Unlocked {unlock}. goals.mastery.unlocked=Unlocked {unlock}.
goals.mastery.confirm=Spend {cost} goal points to unlock {unlock}? goals.mastery.confirm=Spend {cost} goal points to unlock {unlock}?
goals.mastery.already_maxed=Crafting Mastery is already maxed out. goals.mastery.already_maxed={category} is already maxed out.
goals.mastery.not_enough_points=Need {cost} goal points. You have {unspent}. goals.mastery.not_enough_points=Need {cost} goal points. You have {unspent}.
goals.mastery.spend_failed=Could not spend the goal point. goals.mastery.spend_failed=Could not spend the goal point.
goals.mastery.crafting.level1=Crafted basic tools are sturdier. goals.mastery.crafting.level1=Crafted basic tools are sturdier.
goals.mastery.crafting.level2=Unlock great spear recipe. goals.mastery.crafting.level2=Unlock great spear recipe.
goals.mastery.crafting.level3=Great spear reaches 2 tiles but has a slower attack window. goals.mastery.crafting.level3=Great spear reaches 2 tiles but has a slower attack window.
goals.mastery.crafting.level4=Personal tools, weapons, and clothing no longer wear out.
goals.mastery.leadership.level1=Residents are careful and break fewer tools and weapons.
goals.mastery.leadership.level2=Residents are organized and succeed at work more often.
goals.mastery.leadership.level3=Residents act faster during defense and urgent work.
goals.mastery.leadership.level4=Residents ration food, eating every 12 hours instead of every 8.
goals.mastery.taming.level1=Pets can retrieve dropped items.
goals.mastery.taming.level2=Pets are heartier and gain one maximum health.
goals.mastery.taming.level3=Pets recover from knockout faster.
goals.mastery.taming.level4=Bonded pets no longer require food and stay fully loyal.
crafting.weapons.option.great_spear=Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2] crafting.weapons.option.great_spear=Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2]
crafting.weapons.crafted.great_spear=Crafted a Great Spear. crafting.weapons.crafted.great_spear=Crafted a Great Spear.
crafting.weapons.great_spear.requires_mastery=Great spear requires Crafting Mastery 2. crafting.weapons.great_spear.requires_mastery=Great spear requires Crafting Mastery 2.
@@ -670,7 +692,7 @@ msg.03268c7d7239=backpacks
msg.03976920927e=rope msg.03976920927e=rope
; src/item_registry.nvgt:item_display:small_game ; src/item_registry.nvgt:item_display:small_game
msg.0406529811c7=Small Game msg.0406529811c7=Small Game
; draugnorak.nvgt:653:ui_info_box[2] ; draugnorak.nvgt:656:ui_info_box[2]
msg.041d8413712d=A crash log was written to your save data folder. msg.041d8413712d=A crash log was written to your save data folder.
; seed:learn_sounds_label:sounds/enemies/vampyr1.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr1.ogg
msg.04a8916a9494=vampyr1 msg.04a8916a9494=vampyr1
@@ -678,6 +700,8 @@ msg.04a8916a9494=vampyr1
msg.0532db2192fa=incense msg.0532db2192fa=incense
; src/bosses/bandit_hideout.nvgt:787:insert_last[0] ; src/bosses/bandit_hideout.nvgt:787:insert_last[0]
msg.066723a92e94==== Victory Rewards === msg.066723a92e94==== Victory Rewards ===
; seed:learn_sounds_label:sounds/enemies/corpse_worm_dies.ogg
msg.06c9fefbd6d7=corpse worm dies
; src/quests/enchanted_melody_game.nvgt:36:insert_last[0] ; src/quests/enchanted_melody_game.nvgt:36:insert_last[0]
msg.07e9ab246cdd=After closing this screen, you can practice the notes. msg.07e9ab246cdd=After closing this screen, you can practice the notes.
; src/item_registry.nvgt:item_plural:sinew ; src/item_registry.nvgt:item_plural:sinew
@@ -690,6 +714,8 @@ msg.09c28ae8f83b=Stones
msg.09d016686864=Stable not built msg.09d016686864=Stable not built
; src/item_registry.nvgt:item_display:reed_baskets ; src/item_registry.nvgt:item_display:reed_baskets
msg.0a3bdcef1906=Reed Baskets msg.0a3bdcef1906=Reed Baskets
; seed:learn_sounds_label:sounds/new_goal.ogg
msg.0a6e19e37b4d=new goal
; src/quests/enchanted_melody_game.nvgt:26:insert_last[0] ; src/quests/enchanted_melody_game.nvgt:26:insert_last[0]
msg.0a9d6438c818==== Enchanted Melody === msg.0a9d6438c818==== Enchanted Melody ===
; src/bosses/bandit_hideout.nvgt:305:insert_last[0] ; src/bosses/bandit_hideout.nvgt:305:insert_last[0]
@@ -736,7 +762,7 @@ msg.18b837bb6f43=bat1
msg.18c77e824a2a=yeti dies msg.18c77e824a2a=yeti dies
; seed:learn_sounds_label:sounds/enemies/bandit_dies.ogg ; seed:learn_sounds_label:sounds/enemies/bandit_dies.ogg
msg.1a853cbfbc36=bandit dies msg.1a853cbfbc36=bandit dies
; src/sound_settings.nvgt:48:learn_sounds_add_description[1] ; src/sound_settings.nvgt:50:learn_sounds_add_description[1]
msg.1bb8ef2886a3=Basic undead. msg.1bb8ef2886a3=Basic undead.
; seed:learn_sounds_label:sounds/nature/night.ogg ; seed:learn_sounds_label:sounds/nature/night.ogg
msg.1be2a44cb53d=night msg.1be2a44cb53d=night
@@ -878,7 +904,7 @@ msg.444d4678962b=falling
msg.4537c16badd9=bow fire msg.4537c16badd9=bow fire
; src/item_registry.nvgt:item_plural:snares ; src/item_registry.nvgt:item_plural:snares
msg.455b11a16eb7=snares msg.455b11a16eb7=snares
; src/sound_settings.nvgt:38:learn_sounds_add_description[1] ; src/sound_settings.nvgt:40:learn_sounds_add_description[1]
msg.4671b16b0398=Not quite a zombie nor a vampyr. These undead remember they used to have a home, and maybe there's food there... msg.4671b16b0398=Not quite a zombie nor a vampyr. These undead remember they used to have a home, and maybe there's food there...
; seed:learn_sounds_label:sounds/terrain/draugrhaugr_step.ogg ; seed:learn_sounds_label:sounds/terrain/draugrhaugr_step.ogg
msg.46fcdd91c99e=draugrhaugr step msg.46fcdd91c99e=draugrhaugr step
@@ -916,13 +942,13 @@ msg.5009c8e190ee=turkey
msg.508e8bc0cc57=- Use Up/Down to change the number msg.508e8bc0cc57=- Use Up/Down to change the number
; seed:learn_sounds_label:sounds/weapons/sling_low_range.ogg ; seed:learn_sounds_label:sounds/weapons/sling_low_range.ogg
msg.5123c22ce6a5=sling low range msg.5123c22ce6a5=sling low range
; draugnorak.nvgt:112:insert_last[0] ; draugnorak.nvgt:113:insert_last[0]
msg.528fb1c4e5fb=New Game msg.528fb1c4e5fb=New Game
; seed:learn_sounds_label:sounds/quests/squish.ogg ; seed:learn_sounds_label:sounds/quests/squish.ogg
msg.5460f2e3c43e=squish msg.5460f2e3c43e=squish
; seed:learn_sounds_label:sounds/actions/fishpole_break.ogg ; seed:learn_sounds_label:sounds/actions/fishpole_break.ogg
msg.546330ee64db=fishpole break msg.546330ee64db=fishpole break
; draugnorak.nvgt:653:ui_info_box[0] ; draugnorak.nvgt:656:ui_info_box[0]
msg.54fc2d657ed6=Draugnorak msg.54fc2d657ed6=Draugnorak
; seed:learn_sounds_label:sounds/enemies/vampyr3.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr3.ogg
msg.55748cf43121=vampyr3 msg.55748cf43121=vampyr3
@@ -950,7 +976,7 @@ msg.5cac31311668=Pasture is full. No livestock were recovered.
msg.5cc7429297c8=that can be destroyed with an axe. msg.5cc7429297c8=that can be destroyed with an axe.
; seed:learn_sounds_label:sounds/actions/cast_strength.ogg ; seed:learn_sounds_label:sounds/actions/cast_strength.ogg
msg.5dfc869b7588=cast strength msg.5dfc869b7588=cast strength
; src/time_system.nvgt:794:notify[0] ; src/time_system.nvgt:801:notify[0]
msg.5ea84b1201bb={arg1} favor grants you the eyes of an eagle. msg.5ea84b1201bb={arg1} favor grants you the eyes of an eagle.
; seed:learn_sounds_label:sounds/menu/menu_select.ogg ; seed:learn_sounds_label:sounds/menu/menu_select.ogg
; seed:learn_sounds_label:sounds/menu.bak/menu_select.ogg ; seed:learn_sounds_label:sounds/menu.bak/menu_select.ogg
@@ -1034,8 +1060,8 @@ msg.7e83de91b4a2=bandit female dies
msg.7f7e3bbf8864=An enemy is no longer in range of your currently wielded weapon. msg.7f7e3bbf8864=An enemy is no longer in range of your currently wielded weapon.
; src/item_registry.nvgt:item_display:backpacks ; src/item_registry.nvgt:item_display:backpacks
msg.7fae743693f4=Backpacks msg.7fae743693f4=Backpacks
; draugnorak.nvgt:231:ui_info_box[1] ; draugnorak.nvgt:232:ui_info_box[1]
; draugnorak.nvgt:245:ui_info_box[1] ; draugnorak.nvgt:246:ui_info_box[1]
msg.802aa6576577=Load Game msg.802aa6576577=Load Game
; src/item_registry.nvgt:item_plural:sticks ; src/item_registry.nvgt:item_plural:sticks
msg.803e4c41bbd2=sticks msg.803e4c41bbd2=sticks
@@ -1044,12 +1070,12 @@ msg.803e4c41bbd2=sticks
msg.80655da8d80a=tree msg.80655da8d80a=tree
; src/item_registry.nvgt:item_plural:canoes ; src/item_registry.nvgt:item_plural:canoes
msg.806baaf8e039=canoes msg.806baaf8e039=canoes
; src/time_system.nvgt:776:notify[0] ; src/time_system.nvgt:783:notify[0]
; src/time_system.nvgt:786:notify[0] ; src/time_system.nvgt:793:notify[0]
msg.81df04a81e24={arg1} favor shines upon you. {arg2} msg.81df04a81e24={arg1} favor shines upon you. {arg2}
; src/quests/catch_the_boomerang_game.nvgt:22:insert_last[0] ; src/quests/catch_the_boomerang_game.nvgt:22:insert_last[0]
msg.823be948275f=- Better timing earns more points (up to 4) msg.823be948275f=- Better timing earns more points (up to 4)
; src/sound_settings.nvgt:41:learn_sounds_add_description[1] ; src/sound_settings.nvgt:43:learn_sounds_add_description[1]
msg.83865f248682=More powerful undead. They do not lose track of you when you are in the base. msg.83865f248682=More powerful undead. They do not lose track of you when you are in the base.
; seed:learn_sounds_label:sounds/nature/wind_high.ogg ; seed:learn_sounds_label:sounds/nature/wind_high.ogg
msg.8443de859917=wind high msg.8443de859917=wind high
@@ -1071,7 +1097,7 @@ msg.86e257c3efcb=Oldest notification. {arg1}
msg.87383ce4344d=Bowstrings msg.87383ce4344d=Bowstrings
; src/item_registry.nvgt:item_plural:ropes ; src/item_registry.nvgt:item_plural:ropes
msg.87cdb5c91437=ropes msg.87cdb5c91437=ropes
; src/time_system.nvgt:790:notify[0] ; src/time_system.nvgt:797:notify[0]
msg.8818f1d55166={arg1} radiance fills residents with purpose. msg.8818f1d55166={arg1} radiance fills residents with purpose.
; src/quests/bat_invasion_game.nvgt:7:insert_last[0] ; src/quests/bat_invasion_game.nvgt:7:insert_last[0]
msg.88749dbbbf09==== Bat Invasion === msg.88749dbbbf09==== Bat Invasion ===
@@ -1089,7 +1115,7 @@ msg.8f993ac20023=You enter a narrow mountain pass. A massive Unicorn blocks your
msg.917ee46db0cd=bee msg.917ee46db0cd=bee
; seed:learn_sounds_label:sounds/player_male_damage.ogg ; seed:learn_sounds_label:sounds/player_male_damage.ogg
msg.924e0eb6b6f1=player male damage msg.924e0eb6b6f1=player male damage
; src/time_system.nvgt:781:notify[0] ; src/time_system.nvgt:788:notify[0]
msg.9281d2fe5f08={arg1} favor shines upon you. You feel swift for a while. msg.9281d2fe5f08={arg1} favor shines upon you. You feel swift for a while.
; seed:learn_sounds_label:sounds/actions/climb_rope.ogg ; seed:learn_sounds_label:sounds/actions/climb_rope.ogg
msg.92abc6d6953f=climb rope msg.92abc6d6953f=climb rope
@@ -1140,9 +1166,9 @@ msg.a3cb738850fa=wolf
msg.a3f2439ef01a=skin hat msg.a3f2439ef01a=skin hat
; seed:learn_sounds_label:sounds/quests/bone1.ogg ; seed:learn_sounds_label:sounds/quests/bone1.ogg
msg.a56be51786dc=bone1 msg.a56be51786dc=bone1
; src/sound_settings.nvgt:43:learn_sounds_add_description[1]
; src/sound_settings.nvgt:44:learn_sounds_add_description[1]
; src/sound_settings.nvgt:45:learn_sounds_add_description[1] ; src/sound_settings.nvgt:45:learn_sounds_add_description[1]
; src/sound_settings.nvgt:46:learn_sounds_add_description[1]
; src/sound_settings.nvgt:47:learn_sounds_add_description[1]
msg.a570b024087d=Ever hungry, they feed upon your residents. msg.a570b024087d=Ever hungry, they feed upon your residents.
; src/quests/escape_from_hel_game.nvgt:15:insert_last[0] ; src/quests/escape_from_hel_game.nvgt:15:insert_last[0]
msg.a641f39a6317=- The run ends when you fall into a grave msg.a641f39a6317=- The run ends when you fall into a grave
@@ -1218,7 +1244,7 @@ msg.c01409b3a728=When casting release control when over water. When catching rel
msg.c05feaca7269=No items were recovered. msg.c05feaca7269=No items were recovered.
; src/item_registry.nvgt:item_singular:snare ; src/item_registry.nvgt:item_singular:snare
msg.c1104d82c0bd=snare msg.c1104d82c0bd=snare
; src/sound_settings.nvgt:37:learn_sounds_add_description[1] ; src/sound_settings.nvgt:39:learn_sounds_add_description[1]
msg.c48d642737b2=Inhabits mountainous regions. msg.c48d642737b2=Inhabits mountainous regions.
; src/item_registry.nvgt:item_display:smoked_fish ; src/item_registry.nvgt:item_display:smoked_fish
msg.c4f7e9c21601=Smoked Fish msg.c4f7e9c21601=Smoked Fish
@@ -1228,6 +1254,8 @@ msg.c50641e24962=Your cast missed the water and landed in nearby foliage where i
msg.c52888225c69=fall msg.c52888225c69=fall
; seed:learn_sounds_label:sounds/enemies/bandit1.ogg ; seed:learn_sounds_label:sounds/enemies/bandit1.ogg
msg.c65e5dfc5ba7=bandit1 msg.c65e5dfc5ba7=bandit1
; seed:learn_sounds_label:sounds/enemies/corpse_worm.ogg
msg.c6d56016b910=corpse worm
; src/bosses/bandit_hideout.nvgt:789:insert_last[0] ; src/bosses/bandit_hideout.nvgt:789:insert_last[0]
msg.c72b7844929d=Bandits defeated: {arg1}. msg.c72b7844929d=Bandits defeated: {arg1}.
; seed:learn_sounds_label:sounds/terrain/stream.ogg ; seed:learn_sounds_label:sounds/terrain/stream.ogg
@@ -1259,7 +1287,7 @@ msg.ce3897c6b3be={arg1}: {arg2}
; seed:learn_sounds_label:sounds/items/item_breaks.ogg ; seed:learn_sounds_label:sounds/items/item_breaks.ogg
msg.ce5aeca95fb9=item breaks msg.ce5aeca95fb9=item breaks
; src/i18n.nvgt:677:speak_with_history[0] ; src/i18n.nvgt:677:speak_with_history[0]
; src/pet_system.nvgt:926:speak_with_history[0] ; src/pet_system.nvgt:935:speak_with_history[0]
; src/save_system.nvgt:344:speak_with_history[0] ; src/save_system.nvgt:344:speak_with_history[0]
msg.cea88b214070={arg1} {arg2} msg.cea88b214070={arg1} {arg2}
; seed:manual ; seed:manual
@@ -1268,11 +1296,13 @@ msg.cfe2650b4c6e=Found a stone.
msg.d04a59a6a71b=Controls: LEFT/RIGHT to move, UP to jump, CTRL to attack, ESC to flee msg.d04a59a6a71b=Controls: LEFT/RIGHT to move, UP to jump, CTRL to attack, ESC to flee
; src/item_registry.nvgt:item_singular:skin ; src/item_registry.nvgt:item_singular:skin
msg.d0cb2acd0739=skin msg.d0cb2acd0739=skin
; src/sound_settings.nvgt:37:learn_sounds_add_description[1]
msg.d2e0d305bc2b=A weak crawling enemy that starts appearing outside the base after day 1.
; seed:learn_sounds_label:sounds/enemies/enemy_falls.ogg ; seed:learn_sounds_label:sounds/enemies/enemy_falls.ogg
msg.d34b6217ea75=enemy falls msg.d34b6217ea75=enemy falls
; src/item_registry.nvgt:item_display:skin_gloves ; src/item_registry.nvgt:item_display:skin_gloves
msg.d373510877fd=Skin Gloves msg.d373510877fd=Skin Gloves
; draugnorak.nvgt:653:ui_info_box[1] ; draugnorak.nvgt:656:ui_info_box[1]
; seed:manual ; seed:manual
msg.d39008c4a392=Unhandled exception msg.d39008c4a392=Unhandled exception
; src/item_registry.nvgt:item_singular:backpack ; src/item_registry.nvgt:item_singular:backpack
@@ -1295,7 +1325,7 @@ msg.da0b5a461d98=F or K - First note (lowest pitch)
msg.da11dc5e090c=sling hit msg.da11dc5e090c=sling hit
; seed:learn_sounds_label:sounds/enemies/vampyr_dies.ogg ; seed:learn_sounds_label:sounds/enemies/vampyr_dies.ogg
msg.da93fb9992a3=vampyr dies msg.da93fb9992a3=vampyr dies
; src/sound_settings.nvgt:47:learn_sounds_add_description[1] ; src/sound_settings.nvgt:49:learn_sounds_add_description[1]
msg.dadd68431e60=Inhabits snowy regions. msg.dadd68431e60=Inhabits snowy regions.
; seed:learn_sounds_label:sounds/enemies/exit_range.ogg ; seed:learn_sounds_label:sounds/enemies/exit_range.ogg
msg.db2a8514a0fc=exit range msg.db2a8514a0fc=exit range
@@ -1365,7 +1395,7 @@ msg.e7409fcb54bc=feed fire
msg.e8002c169040=wood msg.e8002c169040=wood
; src/quests/escape_from_hel_game.nvgt:13:insert_last[0] ; src/quests/escape_from_hel_game.nvgt:13:insert_last[0]
msg.e8216720d30b=- Press SPACE to jump over graves msg.e8216720d30b=- Press SPACE to jump over graves
; draugnorak.nvgt:132:insert_last[0] ; draugnorak.nvgt:133:insert_last[0]
msg.e8db3a42f86f=Learn Sounds msg.e8db3a42f86f=Learn Sounds
; src/bosses/bandit_hideout.nvgt:845:insert_last[0] ; src/bosses/bandit_hideout.nvgt:845:insert_last[0]
msg.e8e8f4ee7a5a=You can now engrave weapons with this rune at the crafting menu. msg.e8e8f4ee7a5a=You can now engrave weapons with this rune at the crafting menu.
@@ -1396,7 +1426,7 @@ msg.f3d964225e83=player female damage
msg.f5cabf873590=reed msg.f5cabf873590=reed
; src/bosses/bandit_hideout.nvgt:301:insert_last[0] ; src/bosses/bandit_hideout.nvgt:301:insert_last[0]
msg.f77fc018cb7b=You find a hidden bandit base deep in the forest. msg.f77fc018cb7b=You find a hidden bandit base deep in the forest.
; draugnorak.nvgt:148:insert_last[0] ; draugnorak.nvgt:149:insert_last[0]
msg.f83b6fe3aebf=Exit msg.f83b6fe3aebf=Exit
; src/inventory_items.nvgt:504:speak_with_history[0] ; src/inventory_items.nvgt:504:speak_with_history[0]
; src/quests/skeletal_bard_game.nvgt:26:speak_with_history[0] ; src/quests/skeletal_bard_game.nvgt:26:speak_with_history[0]
+30 -3
View File
@@ -626,6 +626,7 @@ msg.096539f23463=Retumban los tambores de guerra! Preparate para el combate!
msg.09c28ae8f83b=Piedras msg.09c28ae8f83b=Piedras
msg.09d016686864=Establo no construido msg.09d016686864=Establo no construido
msg.0a3bdcef1906=Cestas de junco msg.0a3bdcef1906=Cestas de junco
msg.0a6e19e37b4d=nuevo objetivo
msg.0a9d6438c818==== Melodia Encantada === msg.0a9d6438c818==== Melodia Encantada ===
msg.0b3d8d5cdca6=- Llega a la base y destruye la barricada msg.0b3d8d5cdca6=- Llega a la base y destruye la barricada
msg.0bcd9af79f2d=bosque msg.0bcd9af79f2d=bosque
@@ -984,14 +985,25 @@ system.goals.completed.entry_one={goal}. 1 punto otorgado.
system.goals.completed.none=Aún no se han completado objetivos. system.goals.completed.none=Aún no se han completado objetivos.
system.goals.completed.prompt=Objetivos completados. {option} system.goals.completed.prompt=Objetivos completados. {option}
system.goals.current=Objetivo actual: {goal}. Puntos sin gastar: {unspent}. system.goals.current=Objetivo actual: {goal}. Puntos sin gastar: {unspent}.
system.goals.new=Nuevo objetivo: {goal} Pulsa G para revisar tu objetivo actual.
system.goals.spend_hint=Para gastar puntos de objetivo, pulsa P para abrir el menu de personaje, y luego elige Objetivos y Maestria.
system.goals.goal.build_altar.name=Construye un altar. system.goals.goal.build_altar.name=Construye un altar.
system.goals.goal.build_firepit.name=Construye un fogón. system.goals.goal.build_firepit.name=Construye un fogón.
system.goals.goal.build_storage.name=Construye almacenamiento. system.goals.goal.build_storage.name=Construye almacenamiento.
system.goals.goal.complete_quest.name=Completa una misión. system.goals.goal.complete_quest.name=Completa una misión.
system.goals.goal.completed=Objetivo completado: {goal}. {points} puntos otorgados. system.goals.goal.completed=Objetivo completado: {goal}. 1 punto otorgado.
system.goals.goal.craft_knife.name=Fabrica un cuchillo. system.goals.goal.craft_knife.name=Fabrica un cuchillo.
system.goals.goal.craft_spear.name=Fabrica una lanza. system.goals.goal.craft_spear.name=Fabrica una lanza.
system.goals.goal.engrave_rune.name=Graba una runa. system.goals.goal.engrave_rune.name=Graba una runa.
system.goals.goal.craft_axe.name=Fabrica un hacha de piedra.
system.goals.goal.chop_tree_1.name=Tala un arbol.
system.goals.goal.chop_tree_4.name=Tala 4 arboles.
system.goals.goal.chop_tree_9.name=Tala 9 arboles.
system.goals.goal.chop_tree_27.name=Tala 27 arboles.
system.goals.goal.craft_snare.name=Fabrica una trampa.
system.goals.goal.catch_snare.name=Atrapa algo en una trampa.
system.goals.goal.butcher_game.name=Descuartiza caza.
system.goals.goal.craft_sling.name=Fabrica una honda.
system.goals.goal.light_fire.name=Enciende un fuego. system.goals.goal.light_fire.name=Enciende un fuego.
system.goals.goal.unknown.name=Objetivo desconocido. system.goals.goal.unknown.name=Objetivo desconocido.
system.goals.goal.win_adventure.name=Gana una aventura. system.goals.goal.win_adventure.name=Gana una aventura.
@@ -1014,14 +1026,29 @@ system.goals.mastery.prompt=Maestría. {option}
system.goals.mastery.crafting.level1=Las herramientas básicas fabricadas son más resistentes. system.goals.mastery.crafting.level1=Las herramientas básicas fabricadas son más resistentes.
system.goals.mastery.crafting.level2=Desbloquea la receta de la lanza grande. system.goals.mastery.crafting.level2=Desbloquea la receta de la lanza grande.
system.goals.mastery.crafting.level3=La lanza grande alcanza 2 casillas pero tiene una ventana de ataque más lenta. system.goals.mastery.crafting.level3=La lanza grande alcanza 2 casillas pero tiene una ventana de ataque más lenta.
system.goals.mastery.crafting.level4=Las herramientas, armas y ropa personales ya no se desgastan.
system.goals.mastery.crafting.name=Maestría de Fabricación system.goals.mastery.crafting.name=Maestría de Fabricación
system.goals.mastery.leadership.level1=Los residentes son cuidadosos y rompen menos herramientas y armas.
system.goals.mastery.leadership.level2=Los residentes son organizados y tienen éxito en el trabajo más a menudo.
system.goals.mastery.leadership.level3=Los residentes actúan más rápido durante la defensa y el trabajo urgente.
system.goals.mastery.leadership.level4=Los residentes racionan comida y comen cada 12 horas en vez de cada 8.
system.goals.mastery.leadership.name=Maestría de Liderazgo
system.goals.mastery.taming.level1=Las mascotas pueden recuperar objetos caídos.
system.goals.mastery.taming.level2=Las mascotas son más resistentes y ganan una salud máxima.
system.goals.mastery.taming.level3=Las mascotas se recuperan más rápido tras quedar inconscientes.
system.goals.mastery.taming.level4=Las mascotas vinculadas ya no requieren comida y se mantienen totalmente leales.
system.goals.mastery.taming.name=Maestría de Domesticación
system.goals.mastery.unknown.name=Maestría desconocida system.goals.mastery.unknown.name=Maestría desconocida
system.goals.mastery.unknown_level=Desbloqueo desconocido system.goals.mastery.unknown_level=Desbloqueo desconocido
system.goals.mastery.maxed=Maestría de Fabricación: al máximo system.goals.mastery.maxed={category}: al máximo
system.goals.mastery.summary={category} nivel {level} de {max}. Coste siguiente: {cost} puntos. system.goals.mastery.summary={category} nivel {level} de {max}. Coste siguiente: {cost} puntos.
system.goals.mastery.unlocked=Desbloqueado {unlock}. system.goals.mastery.unlocked=Desbloqueado {unlock}.
system.goals.mastery.confirm=¿Gastar {cost} puntos para desbloquear {unlock}? system.goals.mastery.confirm=¿Gastar {cost} puntos para desbloquear {unlock}?
system.goals.mastery.already_maxed=La Maestría de Fabricación ya está al máximo. system.goals.mastery.already_maxed={category} ya está al máximo.
system.goals.mastery.not_enough_points=Necesitas {cost} puntos. Tienes {unspent}. system.goals.mastery.not_enough_points=Necesitas {cost} puntos. Tienes {unspent}.
system.goals.mastery.spend_failed=No se pudo gastar el punto. system.goals.mastery.spend_failed=No se pudo gastar el punto.
system.goals.menu.back=Atrás system.goals.menu.back=Atrás
msg.06c9fefbd6d7=gusano de cadáver muere
msg.c6d56016b910=gusano de cadáver
msg.d2e0d305bc2b=Un enemigo rastrero débil que empieza a aparecer fuera de la base después del día 1.
+25 -3
View File
@@ -736,9 +736,11 @@ def write_catalog(entries: Dict[str, Dict[str, object]], output_path: Path) -> N
("system.character.info.goals_menu", "Goals"), ("system.character.info.goals_menu", "Goals"),
("system.character.word.hour", "hour"), ("system.character.word.hour", "hour"),
("system.character.word.hours", "hours"), ("system.character.word.hours", "hours"),
("system.goals.new", "New goal: {goal} Press G to review your current goal."),
("system.goals.current", "Current goal: {goal}. Unspent goal points: {unspent}."), ("system.goals.current", "Current goal: {goal}. Unspent goal points: {unspent}."),
("system.goals.all_complete", "All current goals complete. Unspent goal points: {unspent}."), ("system.goals.all_complete", "All current goals complete. Unspent goal points: {unspent}."),
("system.goals.goal.completed", "Goal complete: {goal}. Awarded {points} goal points."), ("system.goals.spend_hint", "To spend goal points, press P for the character menu, then choose Goals and Mastery."),
("system.goals.goal.completed", "Goal complete: {goal}. Awarded 1 goal point."),
("system.goals.reward.one", "Reward: 1 goal point."), ("system.goals.reward.one", "Reward: 1 goal point."),
("system.goals.reward.many", "Reward: {count} goal points."), ("system.goals.reward.many", "Reward: {count} goal points."),
("system.goals.goal.craft_knife.name", "Craft a knife."), ("system.goals.goal.craft_knife.name", "Craft a knife."),
@@ -750,6 +752,15 @@ def write_catalog(entries: Dict[str, Dict[str, object]], output_path: Path) -> N
("system.goals.goal.complete_quest.name", "Complete a quest."), ("system.goals.goal.complete_quest.name", "Complete a quest."),
("system.goals.goal.win_adventure.name", "Win an adventure."), ("system.goals.goal.win_adventure.name", "Win an adventure."),
("system.goals.goal.engrave_rune.name", "Engrave a rune."), ("system.goals.goal.engrave_rune.name", "Engrave a rune."),
("system.goals.goal.craft_axe.name", "Craft a stone axe."),
("system.goals.goal.chop_tree_1.name", "Chop down a tree."),
("system.goals.goal.chop_tree_4.name", "Chop down 4 trees."),
("system.goals.goal.chop_tree_9.name", "Chop down 9 trees."),
("system.goals.goal.chop_tree_27.name", "Chop down 27 trees."),
("system.goals.goal.craft_snare.name", "Craft a snare."),
("system.goals.goal.catch_snare.name", "Catch something in a snare."),
("system.goals.goal.butcher_game.name", "Butcher game."),
("system.goals.goal.craft_sling.name", "Craft a sling."),
("system.goals.goal.unknown.name", "Unknown goal."), ("system.goals.goal.unknown.name", "Unknown goal."),
("system.goals.menu.prompt", "Goals. {option}"), ("system.goals.menu.prompt", "Goals. {option}"),
("system.goals.menu.current", "Current goal: {goal}"), ("system.goals.menu.current", "Current goal: {goal}"),
@@ -767,18 +778,29 @@ def write_catalog(entries: Dict[str, Dict[str, object]], output_path: Path) -> N
("system.goals.completed.entry_many", "{goal}. Awarded {points} goal points."), ("system.goals.completed.entry_many", "{goal}. Awarded {points} goal points."),
("system.goals.mastery.prompt", "Mastery. {option}"), ("system.goals.mastery.prompt", "Mastery. {option}"),
("system.goals.mastery.crafting.name", "Crafting Mastery"), ("system.goals.mastery.crafting.name", "Crafting Mastery"),
("system.goals.mastery.leadership.name", "Leadership Mastery"),
("system.goals.mastery.taming.name", "Taming Mastery"),
("system.goals.mastery.unknown.name", "Unknown mastery"), ("system.goals.mastery.unknown.name", "Unknown mastery"),
("system.goals.mastery.unknown_level", "Unknown unlock"), ("system.goals.mastery.unknown_level", "Unknown unlock"),
("system.goals.mastery.maxed", "Crafting Mastery: maxed out"), ("system.goals.mastery.maxed", "{category}: maxed out"),
("system.goals.mastery.summary", "{category} level {level} of {max}. Next cost: {cost} goal points."), ("system.goals.mastery.summary", "{category} level {level} of {max}. Next cost: {cost} goal points."),
("system.goals.mastery.unlocked", "Unlocked {unlock}."), ("system.goals.mastery.unlocked", "Unlocked {unlock}."),
("system.goals.mastery.confirm", "Spend {cost} goal points to unlock {unlock}?"), ("system.goals.mastery.confirm", "Spend {cost} goal points to unlock {unlock}?"),
("system.goals.mastery.already_maxed", "Crafting Mastery is already maxed out."), ("system.goals.mastery.already_maxed", "{category} is already maxed out."),
("system.goals.mastery.not_enough_points", "Need {cost} goal points. You have {unspent}."), ("system.goals.mastery.not_enough_points", "Need {cost} goal points. You have {unspent}."),
("system.goals.mastery.spend_failed", "Could not spend the goal point."), ("system.goals.mastery.spend_failed", "Could not spend the goal point."),
("system.goals.mastery.crafting.level1", "Crafted basic tools are sturdier."), ("system.goals.mastery.crafting.level1", "Crafted basic tools are sturdier."),
("system.goals.mastery.crafting.level2", "Unlock great spear recipe."), ("system.goals.mastery.crafting.level2", "Unlock great spear recipe."),
("system.goals.mastery.crafting.level3", "Great spear reaches 2 tiles but has a slower attack window."), ("system.goals.mastery.crafting.level3", "Great spear reaches 2 tiles but has a slower attack window."),
("system.goals.mastery.crafting.level4", "Personal tools, weapons, and clothing no longer wear out."),
("system.goals.mastery.leadership.level1", "Residents are careful and break fewer tools and weapons."),
("system.goals.mastery.leadership.level2", "Residents are organized and succeed at work more often."),
("system.goals.mastery.leadership.level3", "Residents act faster during defense and urgent work."),
("system.goals.mastery.leadership.level4", "Residents ration food, eating every 12 hours instead of every 8."),
("system.goals.mastery.taming.level1", "Pets can retrieve dropped items."),
("system.goals.mastery.taming.level2", "Pets are heartier and gain one maximum health."),
("system.goals.mastery.taming.level3", "Pets recover from knockout faster."),
("system.goals.mastery.taming.level4", "Bonded pets no longer require food and stay fully loyal."),
("system.crafting.weapons.option.great_spear", "Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2]"), ("system.crafting.weapons.option.great_spear", "Great Spear (1 Spear, 1 Log, 2 Vines, 2 Sinew) [Requires Crafting Mastery 2]"),
("system.crafting.weapons.crafted.great_spear", "Crafted a Great Spear."), ("system.crafting.weapons.crafted.great_spear", "Crafted a Great Spear."),
("system.crafting.weapons.great_spear.requires_mastery", "Great spear requires Crafting Mastery 2."), ("system.crafting.weapons.great_spear.requires_mastery", "Great spear requires Crafting Mastery 2."),
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+9 -4
View File
@@ -2,7 +2,7 @@
int get_food_requirement() { int get_food_requirement() {
if (residents_count <= 0) if (residents_count <= 0)
return 0; return 0;
return residents_count; // 1 food per resident per 8 hours return residents_count;
} }
int get_total_storage_food() { int get_total_storage_food() {
@@ -68,6 +68,7 @@ int get_horse_resident_cooldown_reduction() {
int get_resident_success_chance(int base_chance) { int get_resident_success_chance(int base_chance) {
int chance = base_chance * get_resident_effect_multiplier(); int chance = base_chance * get_resident_effect_multiplier();
chance += get_leadership_success_bonus();
chance += get_horse_success_bonus(); chance += get_horse_success_bonus();
if (chance > 100) if (chance > 100)
chance = 100; chance = 100;
@@ -75,9 +76,12 @@ int get_resident_success_chance(int base_chance) {
} }
int get_resident_break_chance(int base_chance) { int get_resident_break_chance(int base_chance) {
int chance = (base_chance * get_leadership_break_percent()) / 100;
if (chance < 1 && base_chance > 0)
chance = 1;
if (!blessing_resident_active) if (!blessing_resident_active)
return base_chance; return chance;
int reduced = base_chance / get_resident_effect_multiplier(); int reduced = chance / get_resident_effect_multiplier();
if (reduced < 1 && base_chance > 0) if (reduced < 1 && base_chance > 0)
reduced = 1; reduced = 1;
return reduced; return reduced;
@@ -93,7 +97,8 @@ int get_resident_escape_chance(int base_chance) {
} }
int get_resident_cooldown(int base_cooldown) { int get_resident_cooldown(int base_cooldown) {
int cooldown = base_cooldown / get_resident_effect_multiplier(); int cooldown = (base_cooldown * get_leadership_cooldown_percent()) / 100;
cooldown = cooldown / get_resident_effect_multiplier();
if (cooldown < 1) if (cooldown < 1)
cooldown = 1; cooldown = 1;
return cooldown; return cooldown;
+40 -3
View File
@@ -21,6 +21,7 @@ const int BOW_HIT_BANDIT = 1;
const int BOW_HIT_BOAR = 2; const int BOW_HIT_BOAR = 2;
const int BOW_HIT_ZOMBIE = 3; const int BOW_HIT_ZOMBIE = 3;
const int BOW_HIT_FLYING = 4; const int BOW_HIT_FLYING = 4;
const int BOW_HIT_CORPSE_WORM = 5;
void speak_ammo_blocked(string message) { void speak_ammo_blocked(string message) {
if (message == lastAmmoBlockMessage && ammoBlockTimer.elapsed < AMMO_BLOCK_COOLDOWN_MS) { if (message == lastAmmoBlockMessage && ammoBlockTimer.elapsed < AMMO_BLOCK_COOLDOWN_MS) {
@@ -33,10 +34,11 @@ void speak_ammo_blocked(string message) {
} }
int find_ranged_enemy(int player_x, int range, int direction, bool allow_flying, bool& out hit_bandit, int find_ranged_enemy(int player_x, int range, int direction, bool allow_flying, bool& out hit_bandit,
bool& out hit_boar, bool& out hit_flying_creature) { bool& out hit_boar, bool& out hit_flying_creature, bool& out hit_corpse_worm) {
hit_bandit = false; hit_bandit = false;
hit_boar = false; hit_boar = false;
hit_flying_creature = false; hit_flying_creature = false;
hit_corpse_worm = false;
for (int dist = 1; dist <= range; dist++) { for (int dist = 1; dist <= range; dist++) {
int check_x = player_x + (dist * direction); int check_x = player_x + (dist * direction);
@@ -55,6 +57,12 @@ int find_ranged_enemy(int player_x, int range, int direction, bool allow_flying,
return check_x; return check_x;
} }
CorpseWorm @corpse_worm = get_corpse_worm_at(check_x);
if (corpse_worm != null) {
hit_corpse_worm = true;
return check_x;
}
Undead @undead = get_zombie_at(check_x); Undead @undead = get_zombie_at(check_x);
if (undead != null) { if (undead != null) {
return check_x; return check_x;
@@ -86,6 +94,10 @@ int attack_enemy_ranged(int start_x, int end_x, int damage) {
if (damage_boar_at(check_x, damage)) { if (damage_boar_at(check_x, damage)) {
return check_x; return check_x;
} }
// Then check corpse worms
if (damage_corpse_worm_at(check_x, damage)) {
return check_x;
}
} }
return -1; return -1;
} }
@@ -99,6 +111,10 @@ bool attack_enemy(int target_x, int damage) {
if (damage_boar_at(target_x, damage)) { if (damage_boar_at(target_x, damage)) {
return true; return true;
} }
// Check corpse worms
if (damage_corpse_worm_at(target_x, damage)) {
return true;
}
// Then check zombies // Then check zombies
return damage_zombie_at(target_x, damage); return damage_zombie_at(target_x, damage);
} }
@@ -115,6 +131,8 @@ void perform_spear_attack(int current_x) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BANDIT_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BANDIT_SOUND_VOLUME_STEP);
} else if (get_boar_at(hit_pos) != null) { } else if (get_boar_at(hit_pos) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BOAR_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BOAR_SOUND_VOLUME_STEP);
} else if (get_corpse_worm_at(hit_pos) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, CORPSE_WORM_SOUND_VOLUME_STEP);
} else { } else {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, ZOMBIE_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, ZOMBIE_SOUND_VOLUME_STEP);
} }
@@ -136,6 +154,8 @@ void perform_axe_attack(int current_x) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, BANDIT_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, BANDIT_SOUND_VOLUME_STEP);
} else if (get_boar_at(current_x) != null) { } else if (get_boar_at(current_x) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, BOAR_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, BOAR_SOUND_VOLUME_STEP);
} else if (get_corpse_worm_at(current_x) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, CORPSE_WORM_SOUND_VOLUME_STEP);
} else { } else {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, ZOMBIE_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, current_x, ZOMBIE_SOUND_VOLUME_STEP);
} }
@@ -259,6 +279,8 @@ void update_bow_shot() {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_x, BOAR_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_x, BOAR_SOUND_VOLUME_STEP);
} else if (hit_type == BOW_HIT_ZOMBIE) { } else if (hit_type == BOW_HIT_ZOMBIE) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_x, ZOMBIE_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_x, ZOMBIE_SOUND_VOLUME_STEP);
} else if (hit_type == BOW_HIT_CORPSE_WORM) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_x, CORPSE_WORM_SOUND_VOLUME_STEP);
} }
} }
if (drop_pending && drop_pos >= 0) { if (drop_pending && drop_pos >= 0) {
@@ -284,8 +306,10 @@ void release_bow_attack(int player_x) {
bool hit_bandit = false; bool hit_bandit = false;
bool hit_flying_creature = false; bool hit_flying_creature = false;
bool hit_boar = false; bool hit_boar = false;
bool hit_corpse_worm = false;
int target_x = int target_x =
find_ranged_enemy(player_x, BOW_RANGE, search_direction, true, hit_bandit, hit_boar, hit_flying_creature); find_ranged_enemy(player_x, BOW_RANGE, search_direction, true, hit_bandit, hit_boar, hit_flying_creature,
hit_corpse_worm);
bool hit_tree = false; bool hit_tree = false;
if (target_x == -1) { if (target_x == -1) {
@@ -313,6 +337,9 @@ void release_bow_attack(int player_x) {
} else if (hit_flying_creature) { } else if (hit_flying_creature) {
damage_flying_creature_at(target_x, damage); damage_flying_creature_at(target_x, damage);
hit_type = BOW_HIT_FLYING; hit_type = BOW_HIT_FLYING;
} else if (hit_corpse_worm) {
damage_corpse_worm_at(target_x, damage);
hit_type = BOW_HIT_CORPSE_WORM;
} else { } else {
damage_zombie_at(target_x, damage); damage_zombie_at(target_x, damage);
hit_type = BOW_HIT_ZOMBIE; hit_type = BOW_HIT_ZOMBIE;
@@ -361,8 +388,10 @@ void release_sling_attack(int player_x) {
bool hit_bandit = false; bool hit_bandit = false;
bool hit_flying_creature = false; bool hit_flying_creature = false;
bool hit_boar = false; bool hit_boar = false;
bool hit_corpse_worm = false;
target_x = target_x =
find_ranged_enemy(player_x, SLING_RANGE, search_direction, true, hit_bandit, hit_boar, hit_flying_creature); find_ranged_enemy(player_x, SLING_RANGE, search_direction, true, hit_bandit, hit_boar, hit_flying_creature,
hit_corpse_worm);
// If no enemy found, check for trees (but don't damage them) // If no enemy found, check for trees (but don't damage them)
if (target_x == -1) { if (target_x == -1) {
@@ -404,6 +433,12 @@ void release_sling_attack(int player_x) {
play_1d_with_volume_step("sounds/weapons/sling_hit.ogg", player_x, target_x, false, play_1d_with_volume_step("sounds/weapons/sling_hit.ogg", player_x, target_x, false,
PLAYER_WEAPON_SOUND_VOLUME_STEP); PLAYER_WEAPON_SOUND_VOLUME_STEP);
// Falling sound handled by damage_flying_creature_at // Falling sound handled by damage_flying_creature_at
} else if (hit_corpse_worm) {
damage_corpse_worm_at(target_x, damage);
play_1d_with_volume_step("sounds/weapons/sling_hit.ogg", player_x, target_x, false,
PLAYER_WEAPON_SOUND_VOLUME_STEP);
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", player_x, target_x,
CORPSE_WORM_SOUND_VOLUME_STEP);
} else { } else {
damage_zombie_at(target_x, damage); damage_zombie_at(target_x, damage);
play_1d_with_volume_step("sounds/weapons/sling_hit.ogg", player_x, target_x, false, play_1d_with_volume_step("sounds/weapons/sling_hit.ogg", player_x, target_x, false,
@@ -424,6 +459,8 @@ void perform_great_spear_attack(int current_x) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BANDIT_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BANDIT_SOUND_VOLUME_STEP);
} else if (get_boar_at(hit_pos) != null) { } else if (get_boar_at(hit_pos) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BOAR_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, BOAR_SOUND_VOLUME_STEP);
} else if (get_corpse_worm_at(hit_pos) != null) {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, CORPSE_WORM_SOUND_VOLUME_STEP);
} else { } else {
play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, ZOMBIE_SOUND_VOLUME_STEP); play_creature_hit_sound("sounds/enemies/zombie_hit.ogg", x, hit_pos, ZOMBIE_SOUND_VOLUME_STEP);
} }
+14
View File
@@ -118,6 +118,20 @@ const int BOAR_SIGHT_RANGE = 4;
const int BOAR_CHARGE_SPEED = 500; // ms per tile when charging const int BOAR_CHARGE_SPEED = 500; // ms per tile when charging
const int BOAR_SPAWN_CHANCE_PER_HOUR = 30; const int BOAR_SPAWN_CHANCE_PER_HOUR = 30;
// Corpse worm settings
const int CORPSE_WORM_START_DAY = 2;
const int CORPSE_WORM_HEALTH = 2;
const int CORPSE_WORM_MAX_COUNT = 2;
const int CORPSE_WORM_MOVE_INTERVAL = 1200;
const int CORPSE_WORM_ATTACK_INTERVAL = 3500;
const int CORPSE_WORM_DAMAGE = 1;
const int CORPSE_WORM_SPAWN_ROLL_INTERVAL = 30000;
const int CORPSE_WORM_SPAWN_CHANCE = 8;
const int CORPSE_WORM_SPAWN_MIN_DISTANCE = 5;
const int CORPSE_WORM_SPAWN_MAX_DISTANCE = 14;
const int CORPSE_WORM_FOOTSTEP_MAX_DISTANCE = 4;
const float CORPSE_WORM_SOUND_VOLUME_STEP = 3.0;
// Barricade configuration // Barricade configuration
const int BARRICADE_BASE_HEALTH = 40; const int BARRICADE_BASE_HEALTH = 40;
const int BARRICADE_MAX_HEALTH = 500; const int BARRICADE_MAX_HEALTH = 500;
+3
View File
@@ -442,6 +442,8 @@ void butcher_small_game() {
speak_with_history(trf("system.crafting.materials.butcher.default", butcherDefaultArgs), true); speak_with_history(trf("system.crafting.materials.butcher.default", butcherDefaultArgs), true);
} }
complete_goal(GOAL_BUTCHER_GAME);
// Play sound // Play sound
p.play_stationary("sounds/items/miscellaneous.ogg", false); p.play_stationary("sounds/items/miscellaneous.ogg", false);
} else { } else {
@@ -561,6 +563,7 @@ void butcher_small_game_max() {
butcherMaxArgs.set("feathers", total_feathers); butcherMaxArgs.set("feathers", total_feathers);
butcherMaxArgs.set("down", total_down); butcherMaxArgs.set("down", total_down);
butcherMaxArgs.set("sinew", total_sinew); butcherMaxArgs.set("sinew", total_sinew);
complete_goal(GOAL_BUTCHER_GAME);
speak_with_history(trf("system.crafting.materials.butcher.max_result", butcherMaxArgs), true); speak_with_history(trf("system.crafting.materials.butcher.max_result", butcherMaxArgs), true);
p.play_stationary("sounds/items/miscellaneous.ogg", false); p.play_stationary("sounds/items/miscellaneous.ogg", false);
} }
+3
View File
@@ -127,6 +127,7 @@ void craft_knife_max() {
simulate_crafting(craft_time); simulate_crafting(craft_time);
add_personal_count(ITEM_STONES, -(max_possible * 2)); add_personal_count(ITEM_STONES, -(max_possible * 2));
add_personal_count(ITEM_KNIVES, max_possible); add_personal_count(ITEM_KNIVES, max_possible);
complete_goal(GOAL_CRAFT_KNIFE);
dictionary knifeArgs; dictionary knifeArgs;
knifeArgs.set("count", max_possible); knifeArgs.set("count", max_possible);
speak_with_history(trf("system.crafting.tools.crafted_max.stone_knives", knifeArgs), true); speak_with_history(trf("system.crafting.tools.crafted_max.stone_knives", knifeArgs), true);
@@ -148,6 +149,7 @@ void craft_snare() {
add_personal_count(ITEM_STICKS, -1); add_personal_count(ITEM_STICKS, -1);
add_personal_count(ITEM_VINES, -2); add_personal_count(ITEM_VINES, -2);
add_personal_count(ITEM_SNARES, 1); add_personal_count(ITEM_SNARES, 1);
complete_goal(GOAL_CRAFT_SNARE);
speak_with_history(tr("system.crafting.tools.crafted.snare"), true); speak_with_history(tr("system.crafting.tools.crafted.snare"), true);
} else { } else {
speak_crafting_missing(missing); speak_crafting_missing(missing);
@@ -186,6 +188,7 @@ void craft_snare_max() {
add_personal_count(ITEM_STICKS, -max_craft); add_personal_count(ITEM_STICKS, -max_craft);
add_personal_count(ITEM_VINES, -(max_craft * 2)); add_personal_count(ITEM_VINES, -(max_craft * 2));
add_personal_count(ITEM_SNARES, max_craft); add_personal_count(ITEM_SNARES, max_craft);
complete_goal(GOAL_CRAFT_SNARE);
dictionary snareArgs; dictionary snareArgs;
snareArgs.set("count", max_craft); snareArgs.set("count", max_craft);
speak_with_history(trf("system.crafting.tools.crafted_max.snares", snareArgs), true); speak_with_history(trf("system.crafting.tools.crafted_max.snares", snareArgs), true);
+5
View File
@@ -132,6 +132,7 @@ void craft_spear_max() {
add_personal_count(ITEM_VINES, -max_craft); add_personal_count(ITEM_VINES, -max_craft);
add_personal_count(ITEM_STONES, -max_craft); add_personal_count(ITEM_STONES, -max_craft);
add_personal_count(ITEM_SPEARS, max_craft); add_personal_count(ITEM_SPEARS, max_craft);
complete_goal(GOAL_CRAFT_SPEAR);
dictionary spearArgs; dictionary spearArgs;
spearArgs.set("count", max_craft); spearArgs.set("count", max_craft);
speak_with_history(trf("system.crafting.weapons.crafted_max.spears", spearArgs), true); speak_with_history(trf("system.crafting.weapons.crafted_max.spears", spearArgs), true);
@@ -153,6 +154,7 @@ void craft_sling() {
add_personal_count(ITEM_SKINS, -1); add_personal_count(ITEM_SKINS, -1);
add_personal_count(ITEM_VINES, -2); add_personal_count(ITEM_VINES, -2);
add_personal_count(ITEM_SLINGS, 1); add_personal_count(ITEM_SLINGS, 1);
complete_goal(GOAL_CRAFT_SLING);
speak_with_history(tr("system.crafting.weapons.crafted.sling"), true); speak_with_history(tr("system.crafting.weapons.crafted.sling"), true);
} else { } else {
speak_crafting_missing(missing); speak_crafting_missing(missing);
@@ -191,6 +193,7 @@ void craft_sling_max() {
add_personal_count(ITEM_SKINS, -max_craft); add_personal_count(ITEM_SKINS, -max_craft);
add_personal_count(ITEM_VINES, -(max_craft * 2)); add_personal_count(ITEM_VINES, -(max_craft * 2));
add_personal_count(ITEM_SLINGS, max_craft); add_personal_count(ITEM_SLINGS, max_craft);
complete_goal(GOAL_CRAFT_SLING);
dictionary slingArgs; dictionary slingArgs;
slingArgs.set("count", max_craft); slingArgs.set("count", max_craft);
speak_with_history(trf("system.crafting.weapons.crafted_max.slings", slingArgs), true); speak_with_history(trf("system.crafting.weapons.crafted_max.slings", slingArgs), true);
@@ -276,6 +279,7 @@ void craft_axe() {
add_personal_count(ITEM_VINES, -1); add_personal_count(ITEM_VINES, -1);
add_personal_count(ITEM_STONES, -2); add_personal_count(ITEM_STONES, -2);
add_personal_count(ITEM_AXES, 1); add_personal_count(ITEM_AXES, 1);
complete_goal(GOAL_CRAFT_AXE);
speak_with_history(tr("system.crafting.weapons.crafted.stone_axe"), true); speak_with_history(tr("system.crafting.weapons.crafted.stone_axe"), true);
} else { } else {
speak_crafting_missing(missing); speak_crafting_missing(missing);
@@ -323,6 +327,7 @@ void craft_axe_max() {
add_personal_count(ITEM_VINES, -max_craft); add_personal_count(ITEM_VINES, -max_craft);
add_personal_count(ITEM_STONES, -(max_craft * 2)); add_personal_count(ITEM_STONES, -(max_craft * 2));
add_personal_count(ITEM_AXES, max_craft); add_personal_count(ITEM_AXES, max_craft);
complete_goal(GOAL_CRAFT_AXE);
dictionary axeArgs; dictionary axeArgs;
axeArgs.set("count", max_craft); axeArgs.set("count", max_craft);
speak_with_history(trf("system.crafting.weapons.crafted_max.stone_axes", axeArgs), true); speak_with_history(trf("system.crafting.weapons.crafted_max.stone_axes", axeArgs), true);
+1
View File
@@ -577,6 +577,7 @@ void damage_tree(int target_x, int damage) {
if (target.health <= 0) { if (target.health <= 0) {
target.is_chopped = true; target.is_chopped = true;
record_tree_chopped_goal_progress();
target.depleted = true; target.depleted = true;
target.regen_timer.restart(); target.regen_timer.restart();
target.minutes_since_depletion = 0; target.minutes_since_depletion = 0;
+306 -30
View File
@@ -11,30 +11,44 @@ const int GOAL_BUILD_ALTAR = 5;
const int GOAL_COMPLETE_QUEST = 6; const int GOAL_COMPLETE_QUEST = 6;
const int GOAL_WIN_ADVENTURE = 7; const int GOAL_WIN_ADVENTURE = 7;
const int GOAL_ENGRAVE_RUNE = 8; const int GOAL_ENGRAVE_RUNE = 8;
const int GOAL_COUNT = 9; const int GOAL_CRAFT_AXE = 9;
const int GOAL_CHOP_TREE_1 = 10;
const int GOAL_CHOP_TREE_4 = 11;
const int GOAL_CHOP_TREE_9 = 12;
const int GOAL_CHOP_TREE_27 = 13;
const int GOAL_CATCH_SNARE = 14;
const int GOAL_BUTCHER_GAME = 15;
const int GOAL_CRAFT_SLING = 16;
const int GOAL_CRAFT_SNARE = 17;
const int GOAL_COUNT = 18;
// Mastery spend categories. // Mastery spend categories.
const int MASTERY_CRAFTING = 0; const int MASTERY_CRAFTING = 0;
const int MASTERY_CATEGORY_COUNT = 1; const int MASTERY_LEADERSHIP = 1;
const int MASTERY_TAMING = 2;
const int MASTERY_CATEGORY_COUNT = 3;
// Maximum spendable Crafting Mastery level in the first pass. // Maximum spendable mastery level. Four levels keep the system Norse-themed while preserving a 9-point cap.
const int CRAFTING_MASTERY_MAX_LEVEL = 3; const int MASTERY_MAX_LEVEL = 4;
const string GOAL_ANNOUNCEMENT_SOUND_PATH = "sounds/new_goal";
bool[] goalsCompleted; bool[] goalsCompleted;
int goalPointsUnspent = 0; int goalPointsUnspent = 0;
int goalPointsEarned = 0; int goalPointsEarned = 0;
int craftingMasteryLevel = 0; int craftingMasteryLevel = 0;
int leadershipMasteryLevel = 0;
int tamingMasteryLevel = 0;
int treesChopped = 0;
bool goalAnnouncementPending = false;
bool goalAnnouncementWaitForNextHour = false;
bool goalAnnouncementWaitingForSound = false;
int goalAnnouncementGoalId = -1;
int lastAnnouncedGoalId = -1;
string lastAnnouncedGoalMessage = "";
sound goalAnnouncementSound;
int goal_reward_points(int goalId) { int goal_reward_points(int goalId) {
if (goalId == GOAL_CRAFT_KNIFE) return 1; if (is_valid_goal_id(goalId)) return 1;
if (goalId == GOAL_CRAFT_SPEAR) return 1;
if (goalId == GOAL_BUILD_FIREPIT) return 1;
if (goalId == GOAL_LIGHT_FIRE) return 1;
if (goalId == GOAL_BUILD_STORAGE) return 2;
if (goalId == GOAL_BUILD_ALTAR) return 2;
if (goalId == GOAL_COMPLETE_QUEST) return 2;
if (goalId == GOAL_WIN_ADVENTURE) return 3;
if (goalId == GOAL_ENGRAVE_RUNE) return 3;
return 0; return 0;
} }
@@ -48,6 +62,15 @@ string goal_name_key(int goalId) {
if (goalId == GOAL_COMPLETE_QUEST) return "system.goals.goal.complete_quest.name"; if (goalId == GOAL_COMPLETE_QUEST) return "system.goals.goal.complete_quest.name";
if (goalId == GOAL_WIN_ADVENTURE) return "system.goals.goal.win_adventure.name"; if (goalId == GOAL_WIN_ADVENTURE) return "system.goals.goal.win_adventure.name";
if (goalId == GOAL_ENGRAVE_RUNE) return "system.goals.goal.engrave_rune.name"; if (goalId == GOAL_ENGRAVE_RUNE) return "system.goals.goal.engrave_rune.name";
if (goalId == GOAL_CRAFT_AXE) return "system.goals.goal.craft_axe.name";
if (goalId == GOAL_CHOP_TREE_1) return "system.goals.goal.chop_tree_1.name";
if (goalId == GOAL_CHOP_TREE_4) return "system.goals.goal.chop_tree_4.name";
if (goalId == GOAL_CHOP_TREE_9) return "system.goals.goal.chop_tree_9.name";
if (goalId == GOAL_CHOP_TREE_27) return "system.goals.goal.chop_tree_27.name";
if (goalId == GOAL_CRAFT_SNARE) return "system.goals.goal.craft_snare.name";
if (goalId == GOAL_CATCH_SNARE) return "system.goals.goal.catch_snare.name";
if (goalId == GOAL_BUTCHER_GAME) return "system.goals.goal.butcher_game.name";
if (goalId == GOAL_CRAFT_SLING) return "system.goals.goal.craft_sling.name";
return "system.goals.goal.unknown.name"; return "system.goals.goal.unknown.name";
} }
@@ -67,6 +90,15 @@ string goal_summary(int goalId) {
else if (goalId == GOAL_COMPLETE_QUEST) name = "Complete a quest."; else if (goalId == GOAL_COMPLETE_QUEST) name = "Complete a quest.";
else if (goalId == GOAL_WIN_ADVENTURE) name = "Win an adventure."; else if (goalId == GOAL_WIN_ADVENTURE) name = "Win an adventure.";
else if (goalId == GOAL_ENGRAVE_RUNE) name = "Engrave a rune."; else if (goalId == GOAL_ENGRAVE_RUNE) name = "Engrave a rune.";
else if (goalId == GOAL_CRAFT_AXE) name = "Craft a stone axe.";
else if (goalId == GOAL_CHOP_TREE_1) name = "Chop down a tree.";
else if (goalId == GOAL_CHOP_TREE_4) name = "Chop down 4 trees.";
else if (goalId == GOAL_CHOP_TREE_9) name = "Chop down 9 trees.";
else if (goalId == GOAL_CHOP_TREE_27) name = "Chop down 27 trees.";
else if (goalId == GOAL_CRAFT_SNARE) name = "Craft a snare.";
else if (goalId == GOAL_CATCH_SNARE) name = "Catch something in a snare.";
else if (goalId == GOAL_BUTCHER_GAME) name = "Butcher game.";
else if (goalId == GOAL_CRAFT_SLING) name = "Craft a sling.";
} }
int points = goal_reward_points(goalId); int points = goal_reward_points(goalId);
if (points == 1) { if (points == 1) {
@@ -78,6 +110,7 @@ string goal_summary(int goalId) {
} }
void init_goal_state() { void init_goal_state() {
goalAnnouncementSound.close();
goalsCompleted.resize(GOAL_COUNT); goalsCompleted.resize(GOAL_COUNT);
for (int i = 0; i < GOAL_COUNT; i++) { for (int i = 0; i < GOAL_COUNT; i++) {
goalsCompleted[i] = false; goalsCompleted[i] = false;
@@ -85,6 +118,15 @@ void init_goal_state() {
goalPointsUnspent = 0; goalPointsUnspent = 0;
goalPointsEarned = 0; goalPointsEarned = 0;
craftingMasteryLevel = 0; craftingMasteryLevel = 0;
leadershipMasteryLevel = 0;
tamingMasteryLevel = 0;
treesChopped = 0;
goalAnnouncementPending = false;
goalAnnouncementWaitForNextHour = false;
goalAnnouncementWaitingForSound = false;
goalAnnouncementGoalId = -1;
lastAnnouncedGoalId = -1;
lastAnnouncedGoalMessage = "";
} }
void reset_goal_state() { void reset_goal_state() {
@@ -102,6 +144,16 @@ bool is_goal_completed(int goalId) {
} }
int get_current_goal_id() { int get_current_goal_id() {
int[] goalOrder = {GOAL_CRAFT_KNIFE, GOAL_CRAFT_AXE, GOAL_CHOP_TREE_1, GOAL_CRAFT_SPEAR,
GOAL_CRAFT_SNARE, GOAL_CATCH_SNARE, GOAL_BUILD_FIREPIT, GOAL_LIGHT_FIRE,
GOAL_BUTCHER_GAME, GOAL_CRAFT_SLING, GOAL_BUILD_STORAGE, GOAL_BUILD_ALTAR,
GOAL_COMPLETE_QUEST, GOAL_WIN_ADVENTURE, GOAL_ENGRAVE_RUNE, GOAL_CHOP_TREE_4,
GOAL_CHOP_TREE_9, GOAL_CHOP_TREE_27};
for (uint i = 0; i < goalOrder.length(); i++) {
if (!goalsCompleted[goalOrder[i]]) {
return goalOrder[i];
}
}
for (int i = 0; i < GOAL_COUNT; i++) { for (int i = 0; i < GOAL_COUNT; i++) {
if (!goalsCompleted[i]) { if (!goalsCompleted[i]) {
return i; return i;
@@ -110,6 +162,113 @@ int get_current_goal_id() {
return -1; return -1;
} }
string new_goal_announcement_message(int goalId) {
dictionary args;
args.set("goal", goal_summary(goalId));
return trf("system.goals.new", args);
}
bool speak_new_goal_announcement(int goalId) {
string message = new_goal_announcement_message(goalId);
if (message == lastAnnouncedGoalMessage) {
lastAnnouncedGoalId = goalId;
return false;
}
speak_with_history(message, true);
lastAnnouncedGoalId = goalId;
lastAnnouncedGoalMessage = message;
return true;
}
bool goal_announcement_try_play_sound() {
goalAnnouncementSound.close();
if (goalAnnouncementSound.load(GOAL_ANNOUNCEMENT_SOUND_PATH)) {
goalAnnouncementSound.play();
return true;
}
string oggPath = GOAL_ANNOUNCEMENT_SOUND_PATH + ".ogg";
if (goalAnnouncementSound.load(oggPath)) {
goalAnnouncementSound.play();
return true;
}
string wavPath = GOAL_ANNOUNCEMENT_SOUND_PATH + ".wav";
if (!goalAnnouncementSound.load(wavPath)) {
return false;
}
goalAnnouncementSound.play();
return true;
}
void queue_current_goal_announcement(bool waitForNextHour) {
int currentId = get_current_goal_id();
if (currentId == -1)
return;
if (currentId == lastAnnouncedGoalId)
return;
goalAnnouncementPending = true;
goalAnnouncementWaitForNextHour = waitForNextHour;
goalAnnouncementWaitingForSound = false;
goalAnnouncementGoalId = currentId;
}
void allow_delayed_goal_announcement() {
goalAnnouncementWaitForNextHour = false;
if (!goalAnnouncementPending) {
queue_current_goal_announcement(false);
}
}
void update_goal_announcements() {
if (!goalAnnouncementPending)
return;
if (goalAnnouncementWaitForNextHour)
return;
int currentId = get_current_goal_id();
if (currentId == -1) {
goalAnnouncementPending = false;
goalAnnouncementWaitingForSound = false;
goalAnnouncementGoalId = -1;
goalAnnouncementSound.close();
return;
}
if (currentId == lastAnnouncedGoalId) {
goalAnnouncementPending = false;
goalAnnouncementWaitingForSound = false;
goalAnnouncementGoalId = -1;
goalAnnouncementSound.close();
return;
}
if (goalAnnouncementGoalId != currentId) {
goalAnnouncementGoalId = currentId;
goalAnnouncementWaitingForSound = false;
goalAnnouncementSound.close();
}
if (goalAnnouncementWaitingForSound) {
if (goalAnnouncementSound.playing)
return;
speak_new_goal_announcement(goalAnnouncementGoalId);
goalAnnouncementPending = false;
goalAnnouncementWaitingForSound = false;
goalAnnouncementGoalId = -1;
return;
}
if (goal_announcement_try_play_sound()) {
goalAnnouncementWaitingForSound = true;
return;
}
speak_new_goal_announcement(goalAnnouncementGoalId);
goalAnnouncementPending = false;
goalAnnouncementGoalId = -1;
}
bool complete_goal(int goalId) { bool complete_goal(int goalId) {
if (!is_valid_goal_id(goalId)) { if (!is_valid_goal_id(goalId)) {
return false; return false;
@@ -126,9 +285,18 @@ bool complete_goal(int goalId) {
args.set("goal", goal_name(goalId)); args.set("goal", goal_name(goalId));
args.set("points", points); args.set("points", points);
notify(trf("system.goals.goal.completed", args)); notify(trf("system.goals.goal.completed", args));
queue_current_goal_announcement(true);
return true; return true;
} }
void record_tree_chopped_goal_progress() {
treesChopped++;
if (treesChopped >= 1) complete_goal(GOAL_CHOP_TREE_1);
if (treesChopped >= 4) complete_goal(GOAL_CHOP_TREE_4);
if (treesChopped >= 9) complete_goal(GOAL_CHOP_TREE_9);
if (treesChopped >= 27) complete_goal(GOAL_CHOP_TREE_27);
}
string speak_current_goal() { string speak_current_goal() {
int currentId = get_current_goal_id(); int currentId = get_current_goal_id();
dictionary unspentArgs; dictionary unspentArgs;
@@ -142,24 +310,38 @@ string speak_current_goal() {
return trf("system.goals.current", args); return trf("system.goals.current", args);
} }
string speak_current_goal_with_spend_hint() {
string message = speak_current_goal();
if (goalPointsUnspent > 0) {
message += " " + tr("system.goals.spend_hint");
}
return message;
}
void check_goal_key() { void check_goal_key() {
if (key_pressed(KEY_G)) { if (key_pressed(KEY_G)) {
speak_with_history(speak_current_goal(), true); speak_with_history(speak_current_goal_with_spend_hint(), true);
} }
} }
string mastery_category_name(int categoryId) { string mastery_category_name(int categoryId) {
if (categoryId == MASTERY_CRAFTING) return tr("system.goals.mastery.crafting.name"); if (categoryId == MASTERY_CRAFTING) return tr("system.goals.mastery.crafting.name");
if (categoryId == MASTERY_LEADERSHIP) return tr("system.goals.mastery.leadership.name");
if (categoryId == MASTERY_TAMING) return tr("system.goals.mastery.taming.name");
return tr("system.goals.mastery.unknown.name"); return tr("system.goals.mastery.unknown.name");
} }
int mastery_current_level(int categoryId) { int mastery_current_level(int categoryId) {
if (categoryId == MASTERY_CRAFTING) return craftingMasteryLevel; if (categoryId == MASTERY_CRAFTING) return craftingMasteryLevel;
if (categoryId == MASTERY_LEADERSHIP) return leadershipMasteryLevel;
if (categoryId == MASTERY_TAMING) return tamingMasteryLevel;
return 0; return 0;
} }
int mastery_max_level(int categoryId) { int mastery_max_level(int categoryId) {
if (categoryId == MASTERY_CRAFTING) return CRAFTING_MASTERY_MAX_LEVEL; if (categoryId == MASTERY_CRAFTING) return MASTERY_MAX_LEVEL;
if (categoryId == MASTERY_LEADERSHIP) return MASTERY_MAX_LEVEL;
if (categoryId == MASTERY_TAMING) return MASTERY_MAX_LEVEL;
return 0; return 0;
} }
@@ -168,10 +350,11 @@ int mastery_cost_for_next_level(int categoryId) {
int maxLevel = mastery_max_level(categoryId); int maxLevel = mastery_max_level(categoryId);
if (level >= maxLevel) if (level >= maxLevel)
return -1; return -1;
if (categoryId == MASTERY_CRAFTING) { if (categoryId == MASTERY_CRAFTING || categoryId == MASTERY_LEADERSHIP || categoryId == MASTERY_TAMING) {
if (level == 0) return 2; if (level == 0) return 1;
if (level == 1) return 3; if (level == 1) return 2;
if (level == 2) return 4; if (level == 2) return 3;
if (level == 3) return 3;
} }
return -1; return -1;
} }
@@ -181,6 +364,19 @@ string mastery_unlock_key(int categoryId, int level) {
if (level == 1) return "system.goals.mastery.crafting.level1"; if (level == 1) return "system.goals.mastery.crafting.level1";
if (level == 2) return "system.goals.mastery.crafting.level2"; if (level == 2) return "system.goals.mastery.crafting.level2";
if (level == 3) return "system.goals.mastery.crafting.level3"; if (level == 3) return "system.goals.mastery.crafting.level3";
if (level == 4) return "system.goals.mastery.crafting.level4";
}
if (categoryId == MASTERY_LEADERSHIP) {
if (level == 1) return "system.goals.mastery.leadership.level1";
if (level == 2) return "system.goals.mastery.leadership.level2";
if (level == 3) return "system.goals.mastery.leadership.level3";
if (level == 4) return "system.goals.mastery.leadership.level4";
}
if (categoryId == MASTERY_TAMING) {
if (level == 1) return "system.goals.mastery.taming.level1";
if (level == 2) return "system.goals.mastery.taming.level2";
if (level == 3) return "system.goals.mastery.taming.level3";
if (level == 4) return "system.goals.mastery.taming.level4";
} }
return "system.goals.mastery.unknown_level"; return "system.goals.mastery.unknown_level";
} }
@@ -194,7 +390,9 @@ string mastery_level_summary(int categoryId) {
int maxLevel = mastery_max_level(categoryId); int maxLevel = mastery_max_level(categoryId);
int cost = mastery_cost_for_next_level(categoryId); int cost = mastery_cost_for_next_level(categoryId);
if (level >= maxLevel) { if (level >= maxLevel) {
return tr("system.goals.mastery.maxed"); dictionary maxedArgs;
maxedArgs.set("category", mastery_category_name(categoryId));
return trf("system.goals.mastery.maxed", maxedArgs);
} }
dictionary args; dictionary args;
args.set("category", mastery_category_name(categoryId)); args.set("category", mastery_category_name(categoryId));
@@ -219,17 +417,35 @@ bool spend_mastery_point(int categoryId) {
return false; return false;
if (goalPointsUnspent < cost) if (goalPointsUnspent < cost)
return false; return false;
if (mastery_current_level(categoryId) >= mastery_max_level(categoryId))
return false;
int newLevel = mastery_current_level(categoryId) + 1;
if (categoryId == MASTERY_CRAFTING) { if (categoryId == MASTERY_CRAFTING) {
if (craftingMasteryLevel >= CRAFTING_MASTERY_MAX_LEVEL) craftingMasteryLevel = newLevel;
return false; } else if (categoryId == MASTERY_LEADERSHIP) {
goalPointsUnspent -= cost; leadershipMasteryLevel = newLevel;
craftingMasteryLevel++; } else if (categoryId == MASTERY_TAMING) {
dictionary args; tamingMasteryLevel = newLevel;
args.set("unlock", mastery_unlock_label(categoryId, craftingMasteryLevel)); if (petActive && !is_pet_knocked_out()) {
notify(trf("system.goals.mastery.unlocked", args)); int maxHealth = get_pet_max_health();
return true; if (petHealth < maxHealth)
petHealth = maxHealth;
}
if (tamingMasteryLevel >= 4 && petActive) {
petLoyalty = PET_LOYALTY_MAX;
petHungryWarned = false;
}
} else {
return false;
} }
return false;
goalPointsUnspent -= cost;
dictionary args;
args.set("unlock", mastery_unlock_label(categoryId, newLevel));
notify(trf("system.goals.mastery.unlocked", args));
return true;
} }
float get_crafting_mastery_break_multiplier() { float get_crafting_mastery_break_multiplier() {
@@ -238,6 +454,56 @@ float get_crafting_mastery_break_multiplier() {
return 1.0; return 1.0;
} }
bool crafting_mastery_prevents_personal_wear() {
return craftingMasteryLevel >= 4;
}
int get_leadership_break_percent() {
if (leadershipMasteryLevel >= 1)
return 75;
return 100;
}
int get_leadership_success_bonus() {
if (leadershipMasteryLevel >= 3)
return 10;
if (leadershipMasteryLevel >= 2)
return 5;
return 0;
}
int get_leadership_cooldown_percent() {
if (leadershipMasteryLevel >= 3)
return 75;
return 100;
}
int get_resident_food_interval_hours() {
if (leadershipMasteryLevel >= 4)
return 12;
return 8;
}
bool taming_mastery_allows_retrieval() {
return tamingMasteryLevel >= 1;
}
int get_pet_max_health() {
if (tamingMasteryLevel >= 2)
return PET_HEALTH_MAX + 1;
return PET_HEALTH_MAX;
}
int get_pet_knockout_cooldown_hours() {
if (tamingMasteryLevel >= 3)
return 2;
return PET_KNOCKOUT_COOLDOWN_HOURS;
}
bool taming_mastery_prevents_pet_hunger() {
return tamingMasteryLevel >= 4;
}
int get_goal_points_unspent() { int get_goal_points_unspent() {
return goalPointsUnspent; return goalPointsUnspent;
} }
@@ -250,6 +516,14 @@ int get_crafting_mastery_level() {
return craftingMasteryLevel; return craftingMasteryLevel;
} }
int get_leadership_mastery_level() {
return leadershipMasteryLevel;
}
int get_taming_mastery_level() {
return tamingMasteryLevel;
}
void run_goals_menu() { void run_goals_menu() {
string[] options; string[] options;
int currentId = get_current_goal_id(); int currentId = get_current_goal_id();
@@ -422,7 +696,9 @@ void run_mastery_menu() {
} }
int categoryId = optionCategories[selection]; int categoryId = optionCategories[selection];
if (mastery_current_level(categoryId) >= mastery_max_level(categoryId)) { if (mastery_current_level(categoryId) >= mastery_max_level(categoryId)) {
speak_with_history(tr("system.goals.mastery.already_maxed"), true); dictionary maxedArgs;
maxedArgs.set("category", mastery_category_name(categoryId));
speak_with_history(trf("system.goals.mastery.already_maxed", maxedArgs), true);
continue; continue;
} }
int cost = mastery_cost_for_next_level(categoryId); int cost = mastery_cost_for_next_level(categoryId);
+1 -1
View File
@@ -18,7 +18,7 @@ void run_base_info_menu() {
if (world_storages.length() > 0) { if (world_storages.length() > 0) {
options.insert_last("Storage built. Total items " + get_storage_total_items()); options.insert_last("Storage built. Total items " + get_storage_total_items());
int daily_food = residents_count * 3; // 1 per resident per 8 hours = 3 per day int daily_food = residents_count * (24 / get_resident_food_interval_hours());
int meat_in_storage = get_storage_count(ITEM_MEAT); int meat_in_storage = get_storage_count(ITEM_MEAT);
int smoked_fish_in_storage = get_storage_count(ITEM_SMOKED_FISH); int smoked_fish_in_storage = get_storage_count(ITEM_SMOKED_FISH);
int basket_food_in_storage = get_storage_count(ITEM_BASKET_FOOD); int basket_food_in_storage = get_storage_count(ITEM_BASKET_FOOD);
+1 -1
View File
@@ -138,7 +138,7 @@ void run_character_info_menu() {
dictionary petArgs; dictionary petArgs;
petArgs.set("pet", get_pet_display_name()); petArgs.set("pet", get_pet_display_name());
petArgs.set("health", petHealth); petArgs.set("health", petHealth);
petArgs.set("max_health", PET_HEALTH_MAX); petArgs.set("max_health", get_pet_max_health());
petArgs.set("loyalty", petLoyalty); petArgs.set("loyalty", petLoyalty);
petArgs.set("max_loyalty", PET_LOYALTY_MAX); petArgs.set("max_loyalty", PET_LOYALTY_MAX);
string petInfo = trf("system.character.info.pet", petArgs); string petInfo = trf("system.character.info.pet", petArgs);
+56 -12
View File
@@ -237,7 +237,7 @@ string get_health_report() {
dictionary petArgs; dictionary petArgs;
petArgs.set("pet", get_pet_display_name()); petArgs.set("pet", get_pet_display_name());
petArgs.set("health", petHealth); petArgs.set("health", petHealth);
petArgs.set("max", PET_HEALTH_MAX); petArgs.set("max", get_pet_max_health());
petArgs.set("loyalty", petLoyalty); petArgs.set("loyalty", petLoyalty);
petArgs.set("max_loyalty", PET_LOYALTY_MAX); petArgs.set("max_loyalty", PET_LOYALTY_MAX);
report += ", " + trf("system.character.report.pet", petArgs); report += ", " + trf("system.character.report.pet", petArgs);
@@ -375,7 +375,7 @@ void knock_out_pet() {
if (!petActive) if (!petActive)
return; return;
petHealth = 0; petHealth = 0;
petKnockoutHoursRemaining = PET_KNOCKOUT_COOLDOWN_HOURS; petKnockoutHoursRemaining = get_pet_knockout_cooldown_hours();
petOut = false; petOut = false;
petPositionValid = false; petPositionValid = false;
stop_pet_travel(); stop_pet_travel();
@@ -537,11 +537,18 @@ void clamp_pet_loyalty() {
petLoyalty = 0; petLoyalty = 0;
if (petLoyalty > PET_LOYALTY_MAX) if (petLoyalty > PET_LOYALTY_MAX)
petLoyalty = PET_LOYALTY_MAX; petLoyalty = PET_LOYALTY_MAX;
if (taming_mastery_prevents_pet_hunger() && petActive)
petLoyalty = PET_LOYALTY_MAX;
} }
void adjust_pet_loyalty(int delta) { void adjust_pet_loyalty(int delta) {
if (!petActive) if (!petActive)
return; return;
if (taming_mastery_prevents_pet_hunger() && delta < 0) {
petLoyalty = PET_LOYALTY_MAX;
petHungryWarned = false;
return;
}
petLoyalty += delta; petLoyalty += delta;
clamp_pet_loyalty(); clamp_pet_loyalty();
if (petLoyalty <= 0) { if (petLoyalty <= 0) {
@@ -611,13 +618,13 @@ void adopt_pet(const string& in soundPath) {
petSoundPath = soundPath; petSoundPath = soundPath;
petType = get_pet_name_from_sound_path(soundPath); petType = get_pet_name_from_sound_path(soundPath);
petGender = (random(0, 1) == 0) ? "Male" : "Female"; petGender = (random(0, 1) == 0) ? "Male" : "Female";
petLoyalty = PET_START_LOYALTY; petLoyalty = taming_mastery_prevents_pet_hunger() ? PET_LOYALTY_MAX : PET_START_LOYALTY;
petHungryWarned = false; petHungryWarned = false;
petOut = false; petOut = false;
petRecallRequested = false; petRecallRequested = false;
petPosition = 0; petPosition = 0;
petPositionValid = false; petPositionValid = false;
petHealth = PET_HEALTH_MAX; petHealth = get_pet_max_health();
petKnockoutHoursRemaining = 0; petKnockoutHoursRemaining = 0;
petAttackTimer.restart(); petAttackTimer.restart();
petRetrieveTimer.restart(); petRetrieveTimer.restart();
@@ -844,6 +851,8 @@ void update_pet_travel() {
hit = damage_undead_at(petTravelTargetPos, damage); hit = damage_undead_at(petTravelTargetPos, damage);
} else if (petTravelTargetKind == 2) { } else if (petTravelTargetKind == 2) {
hit = damage_boar_at(petTravelTargetPos, damage); hit = damage_boar_at(petTravelTargetPos, damage);
} else if (petTravelTargetKind == 3) {
hit = damage_corpse_worm_at(petTravelTargetPos, damage);
} }
} }
if (hit) { if (hit) {
@@ -859,7 +868,7 @@ void update_pet_travel() {
string nextTargetLabel = ""; string nextTargetLabel = "";
int nextTargetKind = -1; int nextTargetKind = -1;
bool hasNextTarget = find_pet_attack_target(nextTargetPos, nextTargetLabel, nextTargetKind); bool hasNextTarget = find_pet_attack_target(nextTargetPos, nextTargetLabel, nextTargetKind);
if (!hasNextTarget) { if (!hasNextTarget && taming_mastery_allows_retrieval()) {
WorldDrop @drop = find_pet_drop_target(); WorldDrop @drop = find_pet_drop_target();
if (drop !is null) { if (drop !is null) {
petRetrieveTimer.restart(); petRetrieveTimer.restart();
@@ -1070,6 +1079,8 @@ WorldDrop @find_pet_drop_target() {
void update_pet_retrieval() { void update_pet_retrieval() {
if (!petActive) if (!petActive)
return; return;
if (!taming_mastery_allows_retrieval())
return;
if (!petOut) if (!petOut)
return; return;
if (petLoyalty <= 0) if (petLoyalty <= 0)
@@ -1141,6 +1152,18 @@ bool find_pet_attack_target(int& out targetPos, string& out targetLabel, int& ou
} }
} }
for (uint i = 0; i < corpse_worms.length(); i++) {
int distance = abs(corpse_worms[i].position - origin);
if (distance > PET_RANGE)
continue;
if (distance < bestDistance) {
bestDistance = distance;
targetPos = corpse_worms[i].position;
targetLabel = i18n_text("corpse worm");
targetKind = 3;
}
}
return targetPos != -1; return targetPos != -1;
} }
@@ -1189,6 +1212,17 @@ bool find_pet_attack_target_by_kind(int targetKind, int referencePos, int& out t
targetPos = ground_games[i].position; targetPos = ground_games[i].position;
} }
} }
} else if (targetKind == 3) {
for (uint i = 0; i < corpse_worms.length(); i++) {
int distanceToOrigin = abs(corpse_worms[i].position - origin);
if (distanceToOrigin > PET_RANGE)
continue;
int distance = abs(corpse_worms[i].position - referencePos);
if (distance < bestDistance) {
bestDistance = distance;
targetPos = corpse_worms[i].position;
}
}
} }
return targetPos != -1; return targetPos != -1;
@@ -1230,9 +1264,11 @@ void update_pet_follow() {
if (petTravelActive) if (petTravelActive)
return; return;
WorldDrop @drop = find_pet_drop_target(); if (taming_mastery_allows_retrieval()) {
if (drop !is null) WorldDrop @drop = find_pet_drop_target();
return; if (drop !is null)
return;
}
int targetPos = -1; int targetPos = -1;
string targetLabel = ""; string targetLabel = "";
@@ -1281,17 +1317,25 @@ void handle_pet_hourly_update(int hour) {
petKnockoutHoursRemaining--; petKnockoutHoursRemaining--;
if (petKnockoutHoursRemaining <= 0) { if (petKnockoutHoursRemaining <= 0) {
petKnockoutHoursRemaining = 0; petKnockoutHoursRemaining = 0;
petHealth = PET_HEALTH_MAX; petHealth = get_pet_max_health();
dictionary recoveredArgs; dictionary recoveredArgs;
recoveredArgs.set("pet", get_pet_display_name()); recoveredArgs.set("pet", get_pet_display_name());
notify(trf("system.pet.recovered_from_injuries", recoveredArgs)); notify(trf("system.pet.recovered_from_injuries", recoveredArgs));
} }
} }
if (petKnockoutHoursRemaining <= 0 && !petOut && petHealth > 0 && petHealth < PET_HEALTH_MAX) { int maxHealth = get_pet_max_health();
if (petKnockoutHoursRemaining <= 0 && !petOut && petHealth > 0 && petHealth < maxHealth) {
petHealth += 1; petHealth += 1;
if (petHealth > PET_HEALTH_MAX) if (petHealth > maxHealth)
petHealth = PET_HEALTH_MAX; petHealth = maxHealth;
}
if (taming_mastery_prevents_pet_hunger()) {
petLoyalty = PET_LOYALTY_MAX;
petHungryWarned = false;
attempt_pet_random_find();
return;
} }
if (petOut) { if (petOut) {
+49 -7
View File
@@ -554,6 +554,7 @@ void clear_world_objects() {
clear_zombies(); clear_zombies();
clear_bandits(); clear_bandits();
clear_corpse_worms();
clear_flying_creatures(); clear_flying_creatures();
clear_mountains(); clear_mountains();
clear_world_drops(); clear_world_drops();
@@ -628,6 +629,7 @@ void reset_game_state() {
// Reset inventory using the registry system // Reset inventory using the registry system
reset_inventory(); reset_inventory();
reset_rune_data();
spear_equipped = false; spear_equipped = false;
great_spear_equipped = false; great_spear_equipped = false;
@@ -718,6 +720,7 @@ void start_new_game() {
if (current_save_file == "") { if (current_save_file == "") {
current_save_file = get_save_filename_for_name(player_name); current_save_file = get_save_filename_for_name(player_name);
} }
queue_current_goal_announcement(false);
save_game_state(); save_game_state();
} }
@@ -981,6 +984,9 @@ bool save_game_state() {
saveData.set("goal_points_unspent", goalPointsUnspent); saveData.set("goal_points_unspent", goalPointsUnspent);
saveData.set("goal_points_earned", goalPointsEarned); saveData.set("goal_points_earned", goalPointsEarned);
saveData.set("crafting_mastery_level", craftingMasteryLevel); saveData.set("crafting_mastery_level", craftingMasteryLevel);
saveData.set("leadership_mastery_level", leadershipMasteryLevel);
saveData.set("taming_mastery_level", tamingMasteryLevel);
saveData.set("trees_chopped", treesChopped);
saveData.set("weather_data", serialize_weather()); saveData.set("weather_data", serialize_weather());
@@ -1224,16 +1230,21 @@ bool load_game_state_from_file(const string& in filename) {
if (petActive) { if (petActive) {
if (petKnockoutHoursRemaining < 0) if (petKnockoutHoursRemaining < 0)
petKnockoutHoursRemaining = 0; petKnockoutHoursRemaining = 0;
if (petKnockoutHoursRemaining > PET_KNOCKOUT_COOLDOWN_HOURS) { int knockoutCooldown = get_pet_knockout_cooldown_hours();
petKnockoutHoursRemaining = PET_KNOCKOUT_COOLDOWN_HOURS; if (petKnockoutHoursRemaining > knockoutCooldown) {
petKnockoutHoursRemaining = knockoutCooldown;
} }
if (petKnockoutHoursRemaining > 0) { if (petKnockoutHoursRemaining > 0) {
petHealth = 0; petHealth = 0;
} else { } else {
if (petHealth <= 0) if (petHealth <= 0)
petHealth = PET_HEALTH_MAX; petHealth = get_pet_max_health();
if (petHealth > PET_HEALTH_MAX) if (petHealth > get_pet_max_health())
petHealth = PET_HEALTH_MAX; petHealth = get_pet_max_health();
}
if (taming_mastery_prevents_pet_hunger()) {
petLoyalty = PET_LOYALTY_MAX;
petHungryWarned = false;
} }
petAttackTimer.restart(); petAttackTimer.restart();
petRetrieveTimer.restart(); petRetrieveTimer.restart();
@@ -1580,14 +1591,45 @@ bool load_game_state_from_file(const string& in filename) {
goalPointsUnspent = int(get_number(saveData, "goal_points_unspent", 0)); goalPointsUnspent = int(get_number(saveData, "goal_points_unspent", 0));
goalPointsEarned = int(get_number(saveData, "goal_points_earned", 0)); goalPointsEarned = int(get_number(saveData, "goal_points_earned", 0));
craftingMasteryLevel = int(get_number(saveData, "crafting_mastery_level", 0)); craftingMasteryLevel = int(get_number(saveData, "crafting_mastery_level", 0));
leadershipMasteryLevel = int(get_number(saveData, "leadership_mastery_level", 0));
tamingMasteryLevel = int(get_number(saveData, "taming_mastery_level", 0));
treesChopped = int(get_number(saveData, "trees_chopped", 0));
if (goalPointsUnspent < 0) if (goalPointsUnspent < 0)
goalPointsUnspent = 0; goalPointsUnspent = 0;
if (goalPointsEarned < goalPointsUnspent) if (goalPointsEarned < goalPointsUnspent)
goalPointsEarned = goalPointsUnspent; goalPointsEarned = goalPointsUnspent;
if (craftingMasteryLevel < 0) if (craftingMasteryLevel < 0)
craftingMasteryLevel = 0; craftingMasteryLevel = 0;
if (craftingMasteryLevel > CRAFTING_MASTERY_MAX_LEVEL) if (craftingMasteryLevel > MASTERY_MAX_LEVEL)
craftingMasteryLevel = CRAFTING_MASTERY_MAX_LEVEL; craftingMasteryLevel = MASTERY_MAX_LEVEL;
if (leadershipMasteryLevel < 0)
leadershipMasteryLevel = 0;
if (leadershipMasteryLevel > MASTERY_MAX_LEVEL)
leadershipMasteryLevel = MASTERY_MAX_LEVEL;
if (tamingMasteryLevel < 0)
tamingMasteryLevel = 0;
if (tamingMasteryLevel > MASTERY_MAX_LEVEL)
tamingMasteryLevel = MASTERY_MAX_LEVEL;
if (treesChopped < 0)
treesChopped = 0;
if (petActive) {
int knockoutCooldown = get_pet_knockout_cooldown_hours();
if (petKnockoutHoursRemaining > knockoutCooldown)
petKnockoutHoursRemaining = knockoutCooldown;
if (petKnockoutHoursRemaining > 0) {
petHealth = 0;
} else {
int maxPetHealth = get_pet_max_health();
if (petHealth <= 0)
petHealth = maxPetHealth;
if (petHealth > maxPetHealth)
petHealth = maxPetHealth;
}
if (taming_mastery_prevents_pet_hunger()) {
petLoyalty = PET_LOYALTY_MAX;
petHungryWarned = false;
}
}
if (current_hour < 0) if (current_hour < 0)
current_hour = 0; current_hour = 0;
+2
View File
@@ -34,6 +34,8 @@ void configure_project_learn_sounds() {
learn_sounds_add_description("sounds/enemies/invasion.ogg", i18n_text("The war drums pound! Prepare for combat!")); learn_sounds_add_description("sounds/enemies/invasion.ogg", i18n_text("The war drums pound! Prepare for combat!"));
learn_sounds_add_description("sounds/items/miscellaneous.ogg", learn_sounds_add_description("sounds/items/miscellaneous.ogg",
i18n_text("You picked up an item for which there is no specific sound.")); i18n_text("You picked up an item for which there is no specific sound."));
learn_sounds_add_description("sounds/enemies/corpse_worm.ogg",
i18n_text("A weak crawling enemy that starts appearing outside the base after day 1."));
learn_sounds_add_description("sounds/enemies/goblin1.ogg", i18n_text("Inhabits mountainous regions.")); learn_sounds_add_description("sounds/enemies/goblin1.ogg", i18n_text("Inhabits mountainous regions."));
learn_sounds_add_description("sounds/enemies/undead_resident1.ogg", learn_sounds_add_description("sounds/enemies/undead_resident1.ogg",
i18n_text("Not quite a zombie nor a vampyr. These undead remember they used to have a home, and " i18n_text("Not quite a zombie nor a vampyr. These undead remember they used to have a home, and "
+10 -2
View File
@@ -122,6 +122,11 @@ void resolve_pending_player_item_break() {
return; return;
if (x > BASE_END) if (x > BASE_END)
return; return;
if (crafting_mastery_prevents_personal_wear()) {
playerItemBreakPending = false;
playerItemBreakPendingType = -1;
return;
}
if (playerItemBreakPendingType == -1) { if (playerItemBreakPendingType == -1) {
playerItemBreakPending = false; playerItemBreakPending = false;
return; return;
@@ -138,6 +143,8 @@ void resolve_pending_player_item_break() {
void attempt_player_item_break_check() { void attempt_player_item_break_check() {
if (playerItemBreakPending) if (playerItemBreakPending)
return; return;
if (crafting_mastery_prevents_personal_wear())
return;
if (playerItemBreaksToday >= PLAYER_ITEM_BREAKS_PER_DAY) if (playerItemBreaksToday >= PLAYER_ITEM_BREAKS_PER_DAY)
return; return;
@@ -820,6 +827,7 @@ void update_time() {
if (hour_timer.elapsed >= MS_PER_HOUR) { if (hour_timer.elapsed >= MS_PER_HOUR) {
hour_timer.restart(); hour_timer.restart();
current_hour++; current_hour++;
allow_delayed_goal_announcement();
if (current_hour >= 24) { if (current_hour >= 24) {
current_hour = 0; current_hour = 0;
current_day++; current_day++;
@@ -835,8 +843,8 @@ void update_time() {
playerItemBreaksToday = 0; playerItemBreaksToday = 0;
} }
// Residents consume food every 8 hours (at midnight, 8am, 4pm) // Residents consume food on the interval controlled by Leadership Mastery.
if (current_hour % 8 == 0) { if (current_hour % get_resident_food_interval_hours() == 0) {
consume_food_for_residents(); consume_food_for_residents();
} }
handle_pet_hourly_update(current_hour); handle_pet_hourly_update(current_hour);
+1
View File
@@ -102,6 +102,7 @@ class WorldSnare {
snareCaughtArgs.set("catch_type", i18n_translate_fragment_value(catch_type)); snareCaughtArgs.set("catch_type", i18n_translate_fragment_value(catch_type));
snareCaughtArgs.set("position", position); snareCaughtArgs.set("position", position);
notify(trf("system.snare.caught_at", snareCaughtArgs)); notify(trf("system.snare.caught_at", snareCaughtArgs));
complete_goal(GOAL_CATCH_SNARE);
} }
} }
} }