diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2c73a3ca7fa2..d7528cda743a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,4 +2,4 @@ blank_issues_enabled: false contact_links: - name: Endless Sky Mobile url: https://github.com/thewierdnut/endless-mobile/issues/ - about: Please report bugs any issues related to the mobile port here. + about: Please report any issues related to the mobile port here. diff --git a/.gitignore b/.gitignore index e335fe03b60e..b69ef8f21d23 100644 --- a/.gitignore +++ b/.gitignore @@ -67,14 +67,11 @@ ipch/ .idea/ .idea_modules/ compile_commands.json -<<<<<<< HEAD /.gitmodules *.swp *.swo -======= CMakeUserPresets.json .gitmodules # static code analysis /.scannerwork ->>>>>>> v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4593c5cc38a2..b1653aa3b83d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,14 @@ cmake_minimum_required(VERSION 3.16...3.29) include(CMakeDependentOption) -if(UNIX AND NOT APPLE) +if(UNIX AND NOT APPLE AND NOT ES_STEAM) option(ES_USE_VCPKG "Use vcpkg to get dependencies." OFF) else() option(ES_USE_VCPKG "Use vcpkg to get dependencies." ON) endif() cmake_dependent_option(ES_GLES "Build the game with OpenGL ES" OFF UNIX OFF) cmake_dependent_option(ES_STEAM "Build the game for the Steam Linux runtime" OFF UNIX OFF) -cmake_dependent_option(ES_USE_SYSTEM_LIBRARIES "Use system libraries instead of the vcpkg ones." ON APPLE OFF) +cmake_dependent_option(ES_USE_SYSTEM_LIBRARIES "Use system libraries instead of the vcpkg ones." ON "APPLE OR ES_STEAM" OFF) cmake_dependent_option(ES_CREATE_BUNDLE "Create a Bundle instead of an executable. Not suitable for development purposes." OFF APPLE OFF) # Support Debug and Release configurations. @@ -58,7 +58,7 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT EndlessSky) set(CMAKE_VS_JUST_MY_CODE_DEBUGGING ON) -project("Endless Sky" VERSION 0.10.7 +project("Endless Sky" VERSION 0.10.8 DESCRIPTION "Space exploration, trading, and combat game." HOMEPAGE_URL https://endless-sky.github.io/ LANGUAGES CXX) diff --git a/android/app/src/main/assets/endless-sky-data/images/ui/mission empty=.ktx b/android/app/src/main/assets/endless-sky-data/images/ui/mission empty=.ktx new file mode 100644 index 000000000000..3d191dfe9805 Binary files /dev/null and b/android/app/src/main/assets/endless-sky-data/images/ui/mission empty=.ktx differ diff --git a/changelog b/changelog index 1e1502e949d7..a82993ada898 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,55 @@ -version 0.10.7 +Version 0.10.8 + * Bug fixes: + * Content bugs: + * Typo fixes. (@eebop, @Hannah-E-M, @roadrunner56, @TheGiraffe3, @tibetiroka) + * Shortened Darkrest's description to better fit the planet description box. (@roadrunner56) + * Replaced duplicated words with weights in phrases. (@tibetiroka) + * The Hai festival jobs now have deadlines, as their descriptions suggested they should have had. (@ziproot) + * Updated Korath World-ship names for Remnant jobs. (@ziproot) + * The '"Benga" Reverse Thruster' now properly makes noise when in use. (@Saugia) + * Engine bugs: + * Fixed a crash when sorting ships without a ship selected with clang. (@warp-core) + * Fixed a crash with non-ASCII characters passed to cctype methods with clang. (@warp-core) + * Fixed a crash when sorting the ship list with no ships. (@warp-core) + * Fixed issues with the player interacting with the game after death. (@tibetiroka) + * Unicode byte order marks at the beginning of data files will no longer be tokenized. (@warp-core) + * The flagship will no longer move through wormholes ahead of escorts when using fleet jumping. (@Koranir) + * Fixed edge cases for the battery only flight check warning. (@nickshanks) + * Fixed a crash when drawing cloaked ship and flagship outlines. (@tibetiroka) + * The "flagship only" flotsam collection setting now works. (@tibetiroka) + * Game content: + * Mission changes: + * The Pact Recon missions will now no longer offer immediately after each other. (@Anarchist2) + * Reduced the pay and availability of Swiftsong jobs. (@roadrunner56) + * In the "Pirate Duel" mission, Umbral is now a marked system instead of a waypoint, meaning it is no longer required to visit the system in order to complete the mission. (@ziproot) + * Balance: + * Reduced "relative heat damage" sources by a factor of 1.5, for consistency with the mass rebalance in v0.10.7. (@Quantumshark) + * Reduced the difficulty of "Wanderers: Mind 6". (@TheGiraffe3) + * Wanderer escorts: + * +1 Tempest + * Friendly Mereti: + * -1 Model 128 + * +2 Model 16 + * Hostile Mereti: + * -1 Model 128 + * -1 Model 64 + * -1 Model 32 + * Game mechanics: + * New mechanics: + * Added a gamerule for controlling disabled fighter projectile collision. (@tibetiroka) + * Illegal mission passengers can now be detected by planetary security. Previously, missions with only illegal passengers could never result in a fine. (@TomGoodIdea) + * User interface: + * The message for a player escort being destroyed will now appear the moment the ship is destroyed instead of after it explodes and will not be duplicated. (@nickshanks) + * The message for the destruction of an escort will now include its model name. (@nickshanks) + * Salaries and tribute payments in the player info panel are now sorted in descending order. (@nickshanks) + * The mission description pane will no longer be shown if there is no mission selected. (@nickshanks) + * The scroll speed setting can now be configured to move from to 10 to 60 pixels at a time in steps of 10, instead of 20 to 60 pixels at a time in steps of 20. (@nickshanks) + * CI/CD and development environment: + * Updated the issue and PR templates to account for the new wiki repository. (@warp-core) + * Fixed the Steam Linux build. (@warp-core) + * Added an action to update the GitHub wiki from the endless-sky/endless-sky-wiki repository. (@warp-core) + +Version 0.10.7 * Big changes: * Rebalanced ship mass and engine performance across the game. (@Quantumshark) * Increased thrust, turn, reverse thrust, and afterburner thrust by 50% for all engines. diff --git a/credits.txt b/credits.txt index 4e60b8863b64..dae31642dbbd 100644 --- a/credits.txt +++ b/credits.txt @@ -1,5 +1,5 @@ Welcome to Endless Sky! -version 0.10.7 +version 0.10.8 The player's manual and other resources are available at: @@ -247,6 +247,7 @@ contributed to Endless Sky: gunqqer Hacklin Hadron1776 + Hannah-E-M har9862 Hatrask Hecter94 @@ -325,6 +326,7 @@ contributed to Endless Sky: nathan-b Nescio0 neurotrope + nickshanks nobodywasishere NomadicVolcano nothing-but-the-rain @@ -412,6 +414,7 @@ contributed to Endless Sky: Terin The-Legendary-M thebigh2014 + TheGiraffe3 TheMarksman-ES thenerdfreak TheUnfetteredOne diff --git a/data/_ui/interfaces.txt b/data/_ui/interfaces.txt index 694daf05203a..9566b69a18c7 100644 --- a/data/_ui/interfaces.txt +++ b/data/_ui/interfaces.txt @@ -294,7 +294,7 @@ interface "main menu" sprite "_menu/side panel" center 360 0 - + visible if "pilot loaded" button e "_Enter Ship" center 435 155 @@ -303,12 +303,12 @@ interface "main menu" button n "_New Pilot" center 435 155 dimensions 90 30 - + visible button l "_Load / Save..." center 300 155 dimensions 120 30 - + # Left panel (credits): button q "_Quit" center -285 155 @@ -427,7 +427,7 @@ interface "start conditions menu" center 0 0 sprite "_menu/buttonless side panel" center 360 0 - + button b "_Back to Menu" center -420 155 dimensions 120 30 @@ -435,7 +435,7 @@ interface "start conditions menu" button s "_Start Game" center -285 155 dimensions 90 30 - + # The box that will contain the description text box "start description" from -105 -160 @@ -473,7 +473,7 @@ interface "load menu" sprite "_menu/side panel" center 360 0 - + button n "_New Pilot" center -420 155 dimensions 120 30 @@ -481,6 +481,7 @@ interface "load menu" button d "_Delete" center -285 155 dimensions 90 30 + sprite "ui/wide button" center -435 195 button x "E_xport..." @@ -501,7 +502,7 @@ interface "load menu" button R "Remove" center 75 155 dimensions 90 30 - + active button b "_Back to Menu" center 300 155 @@ -799,7 +800,7 @@ interface "settings" button r "P_revious" center -210 210 dimensions 90 30 - + @@ -871,11 +872,11 @@ interface "preferences" interface "hud" # Player status. anchor top right - + sprite "ui/status" from 0 0 align top right - + string "location" from -160 25 color "medium" @@ -955,7 +956,7 @@ interface "hud" center 128 128 value "radar radius" 110 value "radar pointer radius" 130 - + sprite "ui/navigation" from 200 0 align top left @@ -969,7 +970,7 @@ interface "hud" color "medium" width 135 truncate back - + sprite "ui/target" from 0 240 align top left @@ -1002,7 +1003,7 @@ interface "hud" dimensions 110 110 color "disabled hull" size 1.5 - + visible if "range display" sprite "ui/range" from 130 263 @@ -1027,7 +1028,7 @@ interface "hud" from 147 358 align top left visible - + string "target name" center 75 395 color "bright" @@ -1048,7 +1049,7 @@ interface "hud" string "mission target" center 75 455 color "medium" - + # Other HUD elements: box "escorts" from 0 442 top left @@ -1226,7 +1227,7 @@ interface "planet" size 18 align right pad 10 0 - + visible if "has outfitter" sprite "ui/planet dialog button" center 280 150 @@ -1236,7 +1237,7 @@ interface "planet" size 18 align right pad 10 0 - + visible if "has job board" sprite "ui/planet dialog button" center -400 150 @@ -1255,7 +1256,7 @@ interface "planet" size 18 align right pad 10 0 - + visible if "has trade" sprite "ui/planet dialog button" center -400 90 @@ -1265,7 +1266,7 @@ interface "planet" size 18 align left pad 10 0 - + visible if "no trade" sprite "ui/planet dialog button" center -400 90 @@ -1275,7 +1276,7 @@ interface "planet" size 18 align left pad 10 0 - + visible if "has bank" sprite "ui/planet dialog button" center -400 210 @@ -1307,6 +1308,7 @@ interface "planet" pad 10 0 visible + active if "has ship" sprite "ui/planet dialog button" center 280 270 @@ -1345,7 +1347,7 @@ interface "news" interface "boarding" sprite "ui/boarding dialog" - + label "item" from -320 -189 align left @@ -1355,14 +1357,14 @@ interface "boarding" label "size" from 10 -189 align right - + label "cargo space free:" from -320 75 align left string "cargo space" from 10 75 align right - + label "crew" from 190 -112 align right @@ -1372,7 +1374,7 @@ interface "boarding" label "defense" from 330 -112 align right - + label "your ship:" from 50 -92 align left @@ -1385,7 +1387,7 @@ interface "boarding" string "your defense" from 330 -92 align right - + label "enemy ship:" from 50 -72 align left @@ -1398,7 +1400,7 @@ interface "boarding" string "enemy defense" from 330 -72 align right - + label "capture odds (attacking):" from 50 -42 align left @@ -1411,7 +1413,7 @@ interface "boarding" string "attack casualties" from 330 -22 align right - + label "survival odds (defending):" from 50 8 align left @@ -1424,27 +1426,27 @@ interface "boarding" string "defense casualties" from 330 28 align right - + active if "can take" button t "_Take" center -235 115 dimensions 70 30 - + active if "can exit" button x "_Done" center -155 115 dimensions 70 30 - + active if "can capture" button c "Attempt _Capture" center -40 115 dimensions 140 30 - + active if "can attack" button a "_Attack" center 120 185 dimensions 80 30 - + active if "can defend" button d "_Defend" center 210 185 @@ -1466,7 +1468,7 @@ interface "hiring" center 170 85 color "bright" align right - + line center -60 95 dimensions 480 1 @@ -1480,7 +1482,7 @@ interface "hiring" string "fleet bunks" center 50 110 align right - + label "required crew" center -290 130 align left @@ -1493,7 +1495,7 @@ interface "hiring" string "salary required" center 170 130 align right - + label "extra crew" center -290 150 align left @@ -1503,27 +1505,27 @@ interface "hiring" string "salary extra" center 170 150 align right - + active if "can hire" sprite "ui/dialog cancel" center 140 355 button h "_Hire" center 140 355 dimensions 80 40 - + active if "can fire" sprite "ui/dialog cancel" center 60 355 button f "_Fire" center 60 355 dimensions 80 40 - + active string "modifier" from -65 150 color "dim" align left - + label "passenger space" center -290 180 align left @@ -1533,14 +1535,14 @@ interface "hiring" string "fleet unused" center 50 180 align right - + label "passengers" center -290 200 align left string "passengers" center 50 200 align right - + label "(Extra crew for your flagship increases your odds of capturing ships," center -60 290 label "and once you capture a ship you need crew members to serve on it.)" @@ -1562,16 +1564,16 @@ interface "trade" button u "B_uy All" center 40 355 dimensions 70 30 - + sprite "ui/wide button" center 130 355 - + active if "can sell" visible if "!can sell outfits" button e "S_ell All" center 130 355 dimensions 90 30 - + active if "can sell outfits" visible if "can sell outfits" button e "S_ell Outfits" @@ -1598,29 +1600,34 @@ interface "bank" interface "mission" bottom + visible if "has description" sprite "ui/mission" align bottom + visible if "!has description" + sprite "ui/mission empty" + align bottom + visible label "cargo space free:" center -130 -85 string "cargo free" center -130 -65 - + label "passenger space:" center 0 -85 string "bunks free" center 0 -65 - + label "today's date:" center 130 -85 string "today" center 130 -65 - + active if "can accept" button a "_Accept Mission" center -45 -25 dimensions 130 30 - + active if "can abort" button A "Abort" center 70 -25 @@ -1640,19 +1647,19 @@ interface "map buttons" bottom right from -464 -50 to -354 0 button s "_Shipyards" from -454 -40 to -364 -10 - + active if "!is outfitters" sprite "ui/wide button" from -364 -50 to -254 0 button o "_Outfitters" from -354 -40 to -264 -10 - + active if "!is missions" sprite "ui/dialog cancel" from -264 -50 to -174 0 button i "M_issions" from -254 -40 to -184 -10 - + active if "!is ports" sprite "ui/dialog cancel" from -184 -50 to -94 0 @@ -1754,12 +1761,12 @@ interface "info panel" visible if "three buttons" sprite "ui/three info buttons" center 0 305 - + box "player" from -500 -290 to -250 280 box "fleet" from -250 -290 to 500 280 - + box "stats" from -500 -290 to -250 280 box "outfits" @@ -1768,7 +1775,7 @@ interface "info panel" from -250 30 to 250 280 box "cargo" from 250 -290 to 500 280 - + visible if "ship tab" button R center -375 -270 @@ -1783,7 +1790,7 @@ interface "info panel" button i center -420 -305 dimensions 120 30 - + visible if "player tab" sprite "ui/player tab" center 0 -310 @@ -1795,7 +1802,7 @@ interface "info panel" button s center -300 -305 dimensions 120 30 - + visible button d "_Done" center 455 305 @@ -1808,7 +1815,7 @@ interface "info panel" center 255 305 dimensions 90 30 active - + visible if "five buttons" button n "_Next" center 145 305 @@ -1816,7 +1823,7 @@ interface "info panel" button p "_Previous" center 45 305 dimensions 90 30 - + visible if "show park" active if "can park" sprite "ui/dialog cancel" @@ -1825,21 +1832,21 @@ interface "info panel" center -55 305 dimensions 70 30 active - + visible if "show unpark" sprite "ui/dialog cancel" center -55 305 button k "Unpar_k" center -55 305 dimensions 70 30 - + visible if "show disown" sprite "ui/dialog cancel" center -150 305 button D "Disown" center -150 305 dimensions 70 30 - + visible if "show dump" active if "enable dump" sprite "ui/wide button" @@ -1848,7 +1855,7 @@ interface "info panel" center -65 305 dimensions 90 30 active - + visible if "show park all" sprite "ui/wide button" center 145 305 @@ -1909,7 +1916,7 @@ interface "hail panel" button b "Pay _Bribe" center 130 115 dimensions 140 30 - + visible if "show dominate" active if "can dominate" button t "Demand _Tribute" diff --git a/data/bunrodea/bunrodea weapons.txt b/data/bunrodea/bunrodea weapons.txt index 5c82220e8cd4..ed060ae5319f 100644 --- a/data/bunrodea/bunrodea weapons.txt +++ b/data/bunrodea/bunrodea weapons.txt @@ -177,7 +177,7 @@ outfit "Swarm Clip" "outfit space" -10 "swarm capacity" 200 ammo "Swarm Missile" - description "Swarm Clips provide a sizeable increase in ammo capacity for Swarm Pods, holding a respectable 200 missiles able to be swiftly loaded into a launcher after its current clip is empty." + description "Swarm Clips provide a sizable increase in ammo capacity for Swarm Pods, holding a respectable 200 missiles able to be swiftly loaded into a launcher after its current clip is empty." outfit "Swarm Missile" category "Ammunition" diff --git a/data/coalition/coalition news.txt b/data/coalition/coalition news.txt index 103d50316a0f..08012f78f932 100644 --- a/data/coalition/coalition news.txt +++ b/data/coalition/coalition news.txt @@ -21,7 +21,7 @@ news "heliarch news" message word "A sizable crowd is watching one of the monitors in the spaceport where an interviewer is speaking to a Heliarch agent. You learn from someone in the crowd that the agent was a professional athlete until recently." - "A news broadcast shows footage of many Heliarch agents arresting a group of terrorists. The Heliarch who was supervising the operation is later interviewed, explaining that the now prisoners were found to have stolen government equipment." + "A news broadcast shows footage of many Heliarch agents arresting a group of terrorists. The Heliarch who was supervising the operation is later interviewed, explaining that the new prisoners were found to have stolen government equipment." "The news show a Heliarch consul giving a short speech in a ship launching ceremony. After they finish, the brand new Heliarch warships are shown heading to their first patrol." "All the spaceport screens momentarily swap to a broadcast from the Heliarch government, where they show a video of several dozens of arrested criminals. The Heliarch host describing the event mentions their sentences range from 40 years to life, prompting varying reactions from the civilian spectators." "During one of the more busy hours on the spaceport, the news details the crimes of a recently arrested terrorist group: arson, kidnapping, theft of government equipment, possession of weapons, conspiring against the Coalition, attacking both government and civilian properties, subversion... The list goes on for a few more minutes." diff --git a/data/coalition/lunarium intro.txt b/data/coalition/lunarium intro.txt index 429284170c7c..8b857c84b58d 100644 --- a/data/coalition/lunarium intro.txt +++ b/data/coalition/lunarium intro.txt @@ -961,7 +961,7 @@ mission "Lunarium: Evacuation 1" ` "Sorry, I'm not available at the moment."` decline label alright - ` One of them brings you to the Spire, sending a message as you two head there, and the hatch is opened right as you arrive. They thank you for helping, and rush to board their own ship and depart. You go up the Spire's ramp and meet some more Kimek from the company, who greet you and guide you through the ship. Halfway through a corridor, they stop and ask that you wait there. A different Kimek carring nearly a dozen different devices emerges from a side corridor, and the group begins patting and circling your body with the devices. You ask them what they're doing, but they don't respond. After every single one of the machines has finished its beeps and chirps around you, and the Kimek seem satisfied, they continue on. Surprisingly, they bring you not to the cockpit, but to one of the bunks, where a Kimek is talking with a Saryd man. Once she sees you're there, the Kimek gives a glance to the Saryd, and leaves with the others, leaving you two alone.` + ` One of them brings you to the Spire, sending a message as you two head there, and the hatch is opened right as you arrive. They thank you for helping, and rush to board their own ship and depart. You go up the Spire's ramp and meet some more Kimek from the company, who greet you and guide you through the ship. Halfway through a corridor, they stop and ask that you wait there. A different Kimek carrying nearly a dozen different devices emerges from a side corridor, and the group begins patting and circling your body with the devices. You ask them what they're doing, but they don't respond. After every single one of the machines has finished its beeps and chirps around you, and the Kimek seem satisfied, they continue on. Surprisingly, they bring you not to the cockpit, but to one of the bunks, where a Kimek is talking with a Saryd man. Once she sees you're there, the Kimek gives a glance to the Saryd, and leaves with the others, leaving you two alone.` branch lunarium has "joined the lunarium" ` Middle-aged, the Saryd has little hair on his head and a dense beard. "Greetings, human friend. your name is, correct?" You nod. "Apologize I do, for the safety measures experienced, you must have. You see, rather sickly lately, I have been, and while usually fine around Kimek or Arach employees and passengers, wish to try my health against a Saryd or human disease, I did not. But, come to listen of my woes, you have not. Called Elirom, and owner of this company, I am. For those wishing to travel in leisure or for work, provide comfortable ships we do," he explains. "Run into some trouble, one of our ships has. Supposed to transport students and teachers back to Second Viridian after their school trip was done, but now waiting for repairs for the ship's malfunctioning outfits, they are. Picked up by , the students must be, so as to not miss their tests, but elsewhere busy, our other ships are. Pick them up in our stead, would you? from our company, you will receive."` diff --git a/data/gamerules.txt b/data/gamerules.txt index 48c74393babe..d7a09439d14d 100644 --- a/data/gamerules.txt +++ b/data/gamerules.txt @@ -51,6 +51,11 @@ gamerules # ALLOWABLE VALUES: any value between 0. and 1. "universal frugal threshold" 0.75 + # Controls which fighters, when disabled, will not be hit by projectiles unless they are directly targeting. + # DEFAULT: all + # ALLOWABLE VALUES: all, none, only player + "disabled fighters avoid projectiles" "all" + # Depreciation related game rules: # The depreciated value of an item that is "age" days old is calculated with the following equation: diff --git a/data/gegno/gegno outfits.txt b/data/gegno/gegno outfits.txt index dbfc06b615cf..274728bcd2c8 100644 --- a/data/gegno/gegno outfits.txt +++ b/data/gegno/gegno outfits.txt @@ -819,7 +819,7 @@ outfit "Excavator" "minable damage" 104 "prospecting" 145 "hit force" -6 - description `Excavator Drills are large drills designed by the Gegno that rip materials out of asteroids in an efficient manner. These types of drill systems are only found on ships specifically designed around them as they require substantial infrastructure to be functional.` + description `Excavators are large drills designed by the Gegno that rip materials out of asteroids in an efficient manner. These types of drill systems are only found on ships specifically designed around them as they require substantial infrastructure to be functional.` effect "excavate" sprite "effect/smoke" diff --git a/data/hai/hai jobs.txt b/data/hai/hai jobs.txt index 4f17706bf195..455b0f801102 100644 --- a/data/hai/hai jobs.txt +++ b/data/hai/hai jobs.txt @@ -222,12 +222,21 @@ mission "Hai Festival [1]" name "Festival at " job repeat - description "For a month each year, the Hai have a huge holiday festival. This group of Hai will pay you for you to transport them and their of supplies to ." + description "For a month each year, the Hai have a huge holiday festival. This group of Hai will pay you for you to transport them and their of supplies to by ." + deadline 0 2 passengers 10 20 cargo "party supplies" 1 2 to offer - month == 3 + or + and + month == 3 + day <= 17 + and + month == 2 + day >= 27 random < 60 + to fail + month >= 4 source government "Hai" destination @@ -248,12 +257,21 @@ mission "Hai Festival [2]" name "Festival at " job repeat - description "For a month each year, the Hai have a huge holiday festival. This group of humans will pay you for you to transport them and their of supplies to ." + description "For a month each year, the Hai have a huge holiday festival. This group of humans will pay you for you to transport them and their of supplies to by ." + deadline 0 2 passengers 10 20 cargo "party supplies" 1 2 to offer - month == 3 + or + and + month == 3 + day <= 17 + and + month == 2 + day >= 27 random < 60 + to fail + month >= 4 source government "Hai" destination @@ -274,12 +292,21 @@ mission "Hai Festival [3]" name "Festival at " job repeat - description "For a month each year, the Hai have a huge holiday festival. This group of Hai and humans will pay you for you to transport them and their of supplies to ." + description "For a month each year, the Hai have a huge holiday festival. This group of Hai and humans will pay you for you to transport them and their of supplies to by ." + deadline 0 2 passengers 10 20 cargo "party supplies" 1 2 to offer - month == 3 + or + and + month == 3 + day <= 17 + and + month == 2 + day >= 27 random < 60 + to fail + month >= 4 source government "Hai" destination @@ -1514,7 +1541,7 @@ mission "Swiftsong Business Convention [1]" passengers 4 2 .1 cargo "office supplies" 1 2 to offer - random < 10 + random < 8 source government "Hai" not planet "Swiftsong" @@ -1522,7 +1549,7 @@ mission "Swiftsong Business Convention [1]" on visit dialog phrase "generic cargo and passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `During the trip, your passengers appeared to be practicing a presentation for the convention. You sense a tinge of nervousness as they give you and leave your ship.` @@ -1536,7 +1563,7 @@ mission "Swiftsong Business Convention [2]" passengers 4 4 .1 cargo "office supplies" 1 3 to offer - random < 5 + random < 2 source government "Hai" not planet "Swiftsong" @@ -1544,7 +1571,7 @@ mission "Swiftsong Business Convention [2]" on visit dialog phrase "generic cargo and passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `During the trip, your passengers appeared to be practicing a presentation for the convention. You sense a tinge of nervousness as they give you and leave your ship.` @@ -1557,7 +1584,7 @@ mission "Swiftsong Film Festival [1]" description "A group of Hai movie buffs will pay you in exchange for transporting them to , where a film festival is taking place." passengers 4 2 .1 to offer - random < 10 + random < 8 source government "Hai" not planet "Swiftsong" @@ -1565,7 +1592,7 @@ mission "Swiftsong Film Festival [1]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. Some of the movie plots they discussed during the trip were bewildering.` @@ -1578,7 +1605,7 @@ mission "Swiftsong Film Festival [2]" description "A group of Hai movie buffs will pay you in exchange for transporting them to , where a large film festival is taking place." passengers 4 4 .1 to offer - random < 5 + random < 3 source government "Hai" not planet "Swiftsong" @@ -1586,7 +1613,7 @@ mission "Swiftsong Film Festival [2]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. Some of the movie plots they discussed during the trip were bewildering.` @@ -1599,7 +1626,7 @@ mission "Swiftsong Music Festival [1]" description "A group of Hai will pay you in exchange for transporting them to , where a music festival is taking place." passengers 4 2 .1 to offer - random < 10 + random < 8 source government "Hai" not planet "Swiftsong" @@ -1607,7 +1634,7 @@ mission "Swiftsong Music Festival [1]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. You can hear the music blasting all the way from the spaceport.` @@ -1620,7 +1647,7 @@ mission "Swiftsong Music Festival [2]" description "A group of Hai will pay you in exchange for transporting them to , where a large music festival is taking place." passengers 4 4 .1 to offer - random < 5 + random < 3 source government "Hai" not planet "Swiftsong" @@ -1628,7 +1655,7 @@ mission "Swiftsong Music Festival [2]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. You can hear the music blasting all the way from the spaceport.` @@ -1641,7 +1668,7 @@ mission "Swiftsong Computer Security Conference [1]" description "A group of Hai will pay you in exchange for transporting them to , where a computer security conference is taking place." passengers 4 2 .1 to offer - random < 10 + random < 8 source government "Hai" not planet "Swiftsong" @@ -1649,7 +1676,7 @@ mission "Swiftsong Computer Security Conference [1]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. Your passengers' conversations went mostly over your head, but they were otherwise pleasant the entire trip.` @@ -1662,7 +1689,7 @@ mission "Swiftsong Computer Security Conference [2]" description "A group of Hai will pay you in exchange for transporting them to , where a large computer security conference is taking place." passengers 4 4 .1 to offer - random < 5 + random < 3 source government "Hai" not planet "Swiftsong" @@ -1670,7 +1697,7 @@ mission "Swiftsong Computer Security Conference [2]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. Your passengers' conversations went mostly over your head, but they were otherwise pleasant the entire trip.` @@ -1682,7 +1709,7 @@ mission "Swiftsong Science Fiction Convention [1]" description "A group of Hai will pay you in exchange for transporting them to , where a science fiction convention is taking place." passengers 4 2 .1 to offer - random < 10 + random < 8 source government "Hai" not planet "Swiftsong" @@ -1690,7 +1717,7 @@ mission "Swiftsong Science Fiction Convention [1]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 50 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. As they leave, one of them gives you a hand gesture that you recognize from an old human sci-fi program.` @@ -1703,7 +1730,7 @@ mission "Swiftsong Science Fiction Convention [2]" description "A group of Hai will pay you in exchange for transporting them to , where a large science fiction convention is taking place." passengers 4 4 .1 to offer - random < 5 + random < 3 source government "Hai" not planet "Swiftsong" @@ -1711,7 +1738,7 @@ mission "Swiftsong Science Fiction Convention [2]" on visit dialog phrase "generic passenger on visit" on complete - payment 10000 150 + payment 10000 100 "reputation: Hai" += 3 dialog `The Hai chitter excitedly as they give you and step off your ship. As they leave, one of them gives you a hand gesture that you recognize from an old human sci-fi program.` diff --git a/data/hai/hai outfits.txt b/data/hai/hai outfits.txt index 9df2a35d914e..6b91b667455b 100644 --- a/data/hai/hai outfits.txt +++ b/data/hai/hai outfits.txt @@ -709,7 +709,7 @@ outfit `"Benga" Reverse Thruster` "reverse thrusting heat" 4.8 "reverse flare sprite" "effect/atomic flare/tiny" "frame rate" 14 - "flare sound" "atomic tiny" + "reverse flare sound" "atomic tiny" description "Considering them to be well worth the steep cost, many Hai freighter pilots install reverse thrusters such as these to supplement the often poor steering on larger Hai vessels." outfit `"Biroo" Reverse Thruster` diff --git a/data/hai/hai reveal news.txt b/data/hai/hai reveal news.txt index c8ecb8119f63..2ee137bacc25 100644 --- a/data/hai/hai reveal news.txt +++ b/data/hai/hai reveal news.txt @@ -392,8 +392,7 @@ phrase "paranoia: media creators are aliens" " the set designer is" " the producer is" word - " an alien" - " an alien" + " an alien" 2 " some kind of alien" word " in disguise." diff --git a/data/hazards.txt b/data/hazards.txt index a65a0244b13f..765ed71f623b 100644 --- a/data/hazards.txt +++ b/data/hazards.txt @@ -16,7 +16,7 @@ hazard "Ember Waste Base Heat" "strength" 0.25 1.75 "system-wide" weapon - "relative heat damage" 0.00035 + "relative heat damage" 0.000233 hazard "Ember Waste Base Storm" "duration" 300 1500 diff --git a/data/human/deep jobs.txt b/data/human/deep jobs.txt index 7fbb4df2ad1a..bcbd61b12d37 100644 --- a/data/human/deep jobs.txt +++ b/data/human/deep jobs.txt @@ -32,10 +32,8 @@ phrase "deep mystery cube pickup" word ` ` word - `Odd.` - `Odd.` - `Strange.` - `Strange.` + `Odd.` 2 + `Strange.` 2 `You think you see a shady figure watching you, but it could be your imagination.` `You overhear someone giving your description, but you can't see where it's coming from or who they're talking to.` `As you leave, you make eye contact with a dangerous-looking individual. Were they watching you? Probably a coincidence.` diff --git a/data/human/free worlds 0 prologue.txt b/data/human/free worlds 0 prologue.txt index 550704d19c85..f3ece35a7053 100644 --- a/data/human/free worlds 0 prologue.txt +++ b/data/human/free worlds 0 prologue.txt @@ -79,9 +79,12 @@ mission "Pact Recon 0" dialog phrase "generic waypoint on visit" on complete payment 25000 + event "pact recon 0" 1 dialog `When you land on , you're approached by Freya Winters. She gives you in exchange for your scanner logs of the Southern systems. "Thank you, Captain. I pray the pirates didn't give you too much trouble," she says. "I'll be in touch when we've got a new assignment for you, assuming you're still interested."` +event "pact recon 0" + mission "Pact Recon 1" landing @@ -97,7 +100,7 @@ mission "Pact Recon 1" waypoint "Wei" to offer random < 40 - has "Pact Recon 0: done" + has "event: pact recon 0" not "event: war begins" on offer @@ -107,9 +110,12 @@ mission "Pact Recon 1" dialog phrase "generic waypoint on visit" on complete payment 35000 + event "pact recon 1" 1 dialog `You transfer your sensor logs to Freya. She thanks you for your work and pays you . "I'll let you know when we need your services again," she says.` +event "pact recon 1" + mission "Pact Recon 2" landing @@ -125,7 +131,7 @@ mission "Pact Recon 2" waypoint "Shaula" to offer random < 40 - has "Pact Recon 1: done" + has "event: pact recon 1" not "event: war begins" on offer @@ -135,9 +141,12 @@ mission "Pact Recon 2" dialog phrase "generic waypoint on visit" on complete payment 70000 + event "pact recon 2" 1 dialog `Freya Winters meets up with you in person soon after you land. "Glad to see you're still in one piece. I pray you didn't have much trouble," she says, as she hands you a credit chip for . "You've been a great help to us. I'll be sure to contact you next time we need a scout."` +event "pact recon 2" + mission "Pact Recon 3" landing @@ -153,7 +162,7 @@ mission "Pact Recon 3" mark "Orvala" to offer random < 40 - has "Pact Recon 2: done" + has "event: pact recon 2" not "event: war begins" on offer dialog `Once again, you receive a message from Freya Winters. "We have another mission for you," she says, "this one a bit more dangerous. We've heard rumors of a pirate fleet amassing in one of the seldom-visited systems in the Dirt Belt, and we need to know where they are. Interested in helping to track them down? As before, you don't need to fight, just observe them."` diff --git a/data/human/free worlds 1 start.txt b/data/human/free worlds 1 start.txt index e8779c3f034a..135129af5b96 100644 --- a/data/human/free worlds 1 start.txt +++ b/data/human/free worlds 1 start.txt @@ -2264,7 +2264,7 @@ mission "FW Rogue Elements" event "navy occupying the south" 45 event "memorial on Deep" conversation - `After you land, you notice that a sizeable crowd has gathered around a video screen near the edge of the spaceport. You approach to find out what's going on. You're about to ask someone what's happening when you overhear Tomek's voice coming from screen. You look up to see a video of Tomek standing atop a Free Worlds warship and addressing an unseen crowd.` + `After you land, you notice that a sizable crowd has gathered around a video screen near the edge of the spaceport. You approach to find out what's going on. You're about to ask someone what's happening when you overhear Tomek's voice coming from screen. You look up to see a video of Tomek standing atop a Free Worlds warship and addressing an unseen crowd.` ` "For generations we have been neglected by the Republic!" he shouts. "Our grievances were ignored! Our pain and suffering was ignored! Our needs were ignored! We cried out for help, and yet the Republic did nothing, allowing our planets to be ravaged by piracy while continuing to tax our credits for services we were not provided. And as the years have gone on the pirates have only become more and more emboldened.` ` "We tried our best, even with the system stacked against us. Councilor Katya Reynolds and others like her spoke on the behalf of billions within the South, Rim, and Dirt Belt. On behalf of us. On behalf of our brothers and sisters, our fathers and mothers, our sons and daughters. And they spat in her face! And when they did that, they spat in our faces!` ` "And so we banded together. Friends and family locked in arms, doing that which the Republic would not. We looked out for each other, and raised our own defenses against the piracy that we so feared. And then we stood up together and told the Republic that we would take their neglect no longer. We shouted that the system does not work, and so we will create our own! We, with the sweat, blood, and tears of generations, birthed these Free Worlds!` diff --git a/data/human/free worlds 3 checkmate.txt b/data/human/free worlds 3 checkmate.txt index dbe4fe9adb52..5b068e6eabbe 100644 --- a/data/human/free worlds 3 checkmate.txt +++ b/data/human/free worlds 3 checkmate.txt @@ -61,7 +61,7 @@ mission "FWC Attack Kaus Borealis" on offer event "fwc attack kaus borealis" conversation - `When you return to New Portland, a sizeable Free Worlds fleet is already parked on the landing pads surrounding the spaceport. JJ explains to you, "When the Navy struck and cut our territory in half, a lot of these ships were cut off from their chain of command and just went and sheltered wherever they could. So it took a bit of doing to gather them all together. And now what we need is another stirring victory, or they'll begin to scatter again."` + `When you return to New Portland, a sizable Free Worlds fleet is already parked on the landing pads surrounding the spaceport. JJ explains to you, "When the Navy struck and cut our territory in half, a lot of these ships were cut off from their chain of command and just went and sheltered wherever they could. So it took a bit of doing to gather them all together. And now what we need is another stirring victory, or they'll begin to scatter again."` choice ` "Are you saying we risk having members of our militia desert?"` goto desert @@ -1992,7 +1992,7 @@ mission "FWC Pug 4C" dialog `You have failed an essential Free Worlds mission. If you want to complete the story line, revert to the autosave or another earlier snapshot of the game.` on offer - event "fwc reconnect ascella" + event "fwc reconnect ascella" 0 conversation `You help Freya to unload and set up the reflector equipment, then contact the Navy on Oblivion and instruct them to point the transmitter in your direction. A few minutes later Admiral Danforth contacts you. "This link appears to be returning too," he says. "So, let's move on. We're going to make an attack on the system, now, and we would welcome your assistance in this battle." You leave the equipment on and return to your ship with Freya.` accept @@ -2001,7 +2001,7 @@ mission "FWC Pug 4C" dialog `You've landed on , but there are still Pug ships circling overhead. You should take off and help finish them off.` on complete log "Succeeded in restoring a few more hyperspace connections, and in driving back the Pug (with the help of the Navy). But, Freya thinks it is way too coincidental that the aliens have left behind the exact technology needed to fix the hyperspace disruptions; it feels like the Pug are playing a game rather than fighting a serious war." - event "fwc reconnect zeta aquilae" + event "fwc reconnect zeta aquilae" 0 dialog `After a few minutes of scanning the surface of , Freya locates another transmitter station that matches the one you found on Oblivion. You contact Admiral Danforth to tell him its location, and he dispatches a crew to take control of it. He also reports to you that once again, apparently all the Pug left the planet during the course of the battle. "A pity," he says. "If we had taken prisoners, maybe we could have gotten some answers from them. Anyway, meet me in the spaceport whenever you're ready to help with our next mission."` npc evade @@ -2072,7 +2072,7 @@ mission "FWC Pug 5" on offer conversation - `You find Admiral Danforth supervising the repairs of the damaged Navy ships. "Glad you survived that battle!" he says. "These alien ships are much more advanced than ours, but we outnumber them, so now that we've established a strong beachhead I think we actually have a chance at defeating them. The only problem is, the majority of our fleet is still up north. With the Vega system cut off, our supply lines are having to go all the way around through the dirt belt. So I'd like to propose liberating Vega next."` + `You find Admiral Danforth supervising the repairs of the damaged Navy ships. "Glad you survived that battle!" he says. "These alien ships are much more advanced than ours, but we outnumber them, so now that we've established a strong beachhead I think we actually have a chance at defeating them. The only problem is, the majority of our fleet is still up north. With the Vega system cut off, our supply lines are having to go all the way around through the Dirt Belt. So I'd like to propose liberating Vega next."` choice ` "That does sound like a good strategic choice."` ` "How will your fleet get to Vega without traveling through the Pug home system? That system is swarming with their ships."` @@ -2094,7 +2094,7 @@ mission "FWC Pug 5" on visit dialog `You've landed on , but there are still Pug ships circling overhead. You should take off and help finish them off.` on complete - event "fwc liberation of vega" + event "fwc liberation of vega" 0 npc government "Navy (Oathkeeper)" @@ -2250,7 +2250,7 @@ mission "FWC Pug 6" ` "Sure, with the Navy at our backs I think we've got a good chance."` ` "As ready as I'll ever be, I guess."` ` She laughs. "I suppose that's the best we can hope for. Do you mind if I ride in your ship tomorrow, rather than one of the others? If this is the end, I'd rather face it with people I know." You agree. She turns back to look out the window.` - ` Since Freya seems to want to be alone, you return downstairs, and discover that a sizeable Oathkeeper fleet has arrived. In the main vestibule of the spaceport, an Oathkeeper officer is leading a group in qigong meditation. And surprisingly, you spot Admiral Danforth sitting with the Muslim prayer group and chanting in fluent Arabic. Meanwhile, the party outside the pub continues.` + ` Since Freya seems to want to be alone, you return downstairs, and discover that a sizable Oathkeeper fleet has arrived. In the main vestibule of the spaceport, an Oathkeeper officer is leading a group in qigong meditation. And surprisingly, you spot Admiral Danforth sitting with the Muslim prayer group and chanting in fluent Arabic. Meanwhile, the party outside the pub continues.` ` Eventually morning comes, and you prepare your ship for the assault on the Pug homeworld...` accept diff --git a/data/human/free worlds 3 reconciliation.txt b/data/human/free worlds 3 reconciliation.txt index 8bf95bdac3a0..c58dcf1e72ee 100644 --- a/data/human/free worlds 3 reconciliation.txt +++ b/data/human/free worlds 3 reconciliation.txt @@ -801,7 +801,7 @@ mission "FW Syndicate Capture 1B" npc system Ruchbah government Syndicate - personality heroic staying nemesis + personality heroic nemesis staying fleet names "syndicate capital" variant @@ -1038,7 +1038,7 @@ mission "FW Pug 2" to offer has "FW Pug 1: done" passengers 1 - blocked `As you are landing, Alondo contacts you and says, "Do you have a bunk free for me?" You do not, so you will need to free one up in order to continue this mission.` + blocked `As you are landing, Alondo contacts you and asks, "Do you have a bunk free for me?" You do not, so you will need to free one up in order to continue this mission.` on fail dialog `You have failed an essential Free Worlds mission. If you want to complete the story line, revert to the autosave or another earlier snapshot of the game.` @@ -1101,16 +1101,16 @@ mission "FW Pug 2A" log "Agreed to travel to Syndicate space through the one remaining hyperspace path that is still open, through the uninhabited star systems to the north." conversation `A palpable sense of fear and near-panic hangs over the spaceport on Earth. At any minute, this system that serves as the very hub of human government could disappear into the same unknown abyss that has swallowed up its neighbors.` - ` Parliament is eager now to meet with you and to receive whatever assistance you may be able to offer. As Alondo stands in front of the chamber asking the members of Parliament for more information, they answer him with respect and deference, far different from how you have been treated here in the past. You learn that although one link remains open to Syndicate space, no one has dared to travel through it. Given the pace at which the other links were cut, they fear that the one remaining link will disappear any day now.` + ` Parliament is eager now to meet with you, and to receive whatever assistance you may be able to offer. As Alondo stands in front of the chamber asking the members of Parliament for more information, they answer him with respect and deference, far different from how you have been treated here in the past. You learn that although one link remains open to Syndicate space, no one has dared to travel through it. Given the pace at which the other links were cut, they fear that the one remaining link will disappear any day now.` ` As the conversation continues, it eventually becomes clear why you have been called here: the Republic wants you to take on the risk none of them is willing to face, and travel through to Syndicate space to reason with their leaders.` choice ` "If this is what it takes to keep human space from being torn into fragments, I will risk my ship to go meet with the Syndicate."` goto yes ` "This sounds like a job for the Navy, not for me. I can't risk being trapped in hostile Syndicate space forever."` goto no - ` "Did the Syndicate communicate anything to you before the links were cut, that might help us guess at their intentions?"` + ` "Did the Syndicate communicate anything to you before the links were cut that might help us guess at their intentions?"` - ` One of the members of Parliament says, "It's all terribly confusing. Our sources in Syndicate space were reporting massive fleet movements just before it happened. We also heard rumors of Syndicate fleets fighting each other, some sort of internal power struggle."` + ` One of the members of Parliament says, "It's all terribly confusing. Our sources in Syndicate space were reporting massive fleet movements just before it happened. We also heard rumors of Syndicate fleets fighting each other. Some sort of internal power struggle."` ` Another man speaks up and adds, "We had also been aware for some time that the Syndicate had gained access to alien technology, through encounters with a nomadic alien species currently inhabiting the galactic core. They may have found a way to use that technology to alter the links." From the surprised expressions on the faces of many of the other members of Parliament, it's clear that this information is new to them.` choice ` "Very well, we will accept this mission."` @@ -2019,7 +2019,7 @@ mission "FW Pug 4C" dialog `You have failed an essential Free Worlds mission. If you want to complete the story line, revert to the autosave or another earlier snapshot of the game.` on offer - event "reconnected delta capricorni" + event "reconnected delta capricorni" 0 conversation `Freya sent detailed instructions with the reflector for where it should be set up and how it should be adjusted to interface with the transmitter back in Pug space. You hand it over to a team of Syndicate engineers, who seem quite capable and confident that they can make it work; you suspect that these are the same engineers who have been playing with equipment stolen from the Korath, so they are no strangers to alien technology.` ` You also meet with Marco Bugati, the Syndicate executive who oversaw the installation of your jump drives, and tell him that you may soon be able to reopen one of the connections to Republic space, as well. You ask if he can send a courier ship to Earth to inform them of the new situation, to have them begin massing a fleet there. He agrees. He also tells you that a few of the Syndicate ships that met you in orbit have been designated as additions to your attack fleet, so they will be traveling back to Maker with you if the reflector succeeds in reopening the link.` @@ -2169,7 +2169,7 @@ mission "FW Pug 5B" on offer log "Succeeded in rendezvousing with the Navy in the Sol system and reopening a link to the Pug territory. But now Shiver is under attack by a massive Pug fleet." - event "reconnected altair" + event "reconnected altair" 0 conversation `You help some Navy engineers on Earth to set up the graviton reflector according to Freya's instructions. As before, soon after the reflector is operational the ground seems to tilt and roll as Freya's beam homes in on the reflector and sets up a harmonic oscillation between the two. "The link is reopening!" says one of the engineers. "We're beginning to receive hyperspace communications from Altair again, and from the Syndicate too."` ` A second later your own communicator beeps. It's Freya. "Get back here quickly," she says. "Bring whatever reinforcements you can. A massive Pug fleet just appeared in orbit."` @@ -2239,7 +2239,7 @@ mission "FW Pug 6" ` "Sure, with the Navy at our backs I think we've got a good chance."` ` "As ready as I'll ever be, I guess."` ` She laughs. "I suppose that's the best we can hope for. Do you mind if I ride in your ship tomorrow, rather than one of the others? If this is the end, I'd rather face it with people I know." You agree. She turns back to look out the window.` - ` Since Freya seems to want to be alone, you return downstairs, and discover that a sizeable Oathkeeper fleet has arrived. In the main vestibule of the spaceport, an Oathkeeper officer is leading a group in qigong meditation. And surprisingly, you spot Admiral Danforth sitting with the Muslim prayer group and chanting in fluent Arabic. Meanwhile, the party outside the pub continues.` + ` Since Freya seems to want to be alone, you return downstairs, and discover that a sizable Oathkeeper fleet has arrived. In the main vestibule of the spaceport, an Oathkeeper officer is leading a group in qigong meditation. And surprisingly, you spot Admiral Danforth sitting with the Muslim prayer group and chanting in fluent Arabic. Meanwhile, the party outside the pub continues.` ` Eventually morning comes, and you prepare your ship for the assault on the Pug homeworld...` accept @@ -2447,7 +2447,7 @@ mission "FW Syndicate Extremists 1A" ` "I don't see why not," says Danforth, fixing Alastair with a piercing gaze. "It's certainly better than leaving it in Syndicate hands."` label end - ` Alastair tells you that the device is being kept on Hephaestus, and the engineers there can install it in your ship. Meanwhile, Danforth will call in the rest of his Oathkeeper fleet. "And when we're through with this, I'll be seeing to it that this Oracle is destroyed so that this can never happen again," says Danforth. Alastair gives a meek nod in agreement. "Now, where are the Alphas."` + ` Alastair tells you that the device is being kept on Hephaestus, and the engineers there can install it in your ship. Meanwhile, Danforth will call in the rest of his Oathkeeper fleet. "And when we're through with this, I'll be seeing to it that this Oracle is destroyed so that this can never happen again," says Danforth. Alastair gives a meek nod in agreement. "Now, where are the Alphas?"` ` "The Alphas are holed up on Buccaneer Bay," says Alastair, "an old pirate world. Good luck in defeating them."` accept diff --git a/data/human/free worlds 4 epilogue.txt b/data/human/free worlds 4 epilogue.txt index a2b3ae1c5776..6e8756e37e20 100644 --- a/data/human/free worlds 4 epilogue.txt +++ b/data/human/free worlds 4 epilogue.txt @@ -45,7 +45,7 @@ mission "FW Epilogue: Ijs and Katya" label game ` "Whoops," says Ijs, "now you've done it, there goes the fourth wall."` - ` Katya laughs. "Well, there's already lots beyond human space to see, and I'm sure you can find more things to do out there as well as closer to home. If you're so eager to explore more of the galaxy, , or to discover what new adventures it has to offer, maybe you should volunteer to help out with creating the stories to populate it. This is an open source game after all, and it relies on people like you to bring it life."` + ` Katya laughs. "Well, there's already lots beyond human space to see, and I'm sure you can find more things to do out there as well as closer to home. If you're so eager to explore more of the galaxy, , or to discover what new adventures it has to offer, maybe you should volunteer to help out with creating the stories to populate it. This is an open source game after all, and it relies on people like you to bring it to life."` goto end label end @@ -189,7 +189,7 @@ mission "FW Epilogue: Danforth" label next ` "Are the pirates giving you any trouble?" you ask.` - ` "A bit," he says. "We still have far too many pirates in this sector, in part due to the Free Worlds driving them out of the South. The pirates grew stronger and more bold as the war dragged on, when all our fleets were busy elsewhere, but now we're beginning to get them under control again."` + ` "A bit," he says. "We still have far too many pirates in this sector, in part due to the Free Worlds mostly driving them out of the South. The pirates grew stronger and more bold as the war dragged on, when all our fleets were busy elsewhere, but now we're beginning to get them under control again."` branch checkmate2 has "free worlds checkmate" @@ -214,7 +214,7 @@ mission "FW Epilogue: Edward" has "free worlds plot completed" on offer conversation "edward epilogue" - npc save disable + npc disable save government "Test Dummy" personality disables heroic staying ship "Leviathan (Plasma Repeater)" "Hunk" @@ -230,7 +230,7 @@ mission "FW Epilogue: Edward" conversation "edward epilogue" branch completed has "FW Epilogue: Edward: done" - `As you complete your landing procedure, you recall having come here to assist in some testing for new weapons, back in the thick of the war. Do you want to check in on Barmy Edwards, the lead engineer?` + `As you complete your landing procedure, you recall having come here to assist in some testing for new weapons, back in the thick of the war. Do you want to check in on Barmy Edward, the lead engineer?` choice ` (Yes.)` ` (No.)` diff --git a/data/human/free worlds side plots.txt b/data/human/free worlds side plots.txt index 16e0e6d4a18d..1d10d02fe14c 100644 --- a/data/human/free worlds side plots.txt +++ b/data/human/free worlds side plots.txt @@ -376,8 +376,8 @@ mission "FW Flamethrower 2" ` "Great," he says, rubbing his hands together with a gleeful expression on his face. He's clearly looking forward to hearing what you think of his latest invention.` accept - npc save disable - personality disables staying heroic + npc disable save + personality disables heroic staying government "Test Dummy" ship "Doombat" "Doombat" diff --git a/data/human/hails.txt b/data/human/hails.txt index a5ca9b31001a..8d9ec3395a93 100644 --- a/data/human/hails.txt +++ b/data/human/hails.txt @@ -2029,9 +2029,9 @@ phrase "friendly civilian" " and " word "witnessed a Quarg Wardragon jump in with one of their jump drives?" - "looked over one of the Quargs' sleek Skylarks?" + "looked over one of the Quarg's sleek Skylarks?" "seen a Quarg Skylark up close?" - "seen the Quargs' Skylances in action?" + "seen the Quarg's Skylances in action?" "seen how the Quarg decimate pirates with their Skylances?" "seen how powerful those Quarg Skylances are?" word @@ -5002,8 +5002,7 @@ phrase "friendly disabled" "could you render assistance" "can we get some help patching up our ship" word - ", please?" - ", please?" + ", please?" 2 " so we can get out of here?" " as soon as possible?" "? I don't want to get stranded here!" @@ -5601,7 +5600,6 @@ phrase "hostile navy" " was founded to" "'s goal is to" "'s directive is to" - "'s directive is to" "'s mission is to" "'s purpose is to" "'s duty is to" @@ -6323,7 +6321,7 @@ phrase "hostile pirate" "walk you out the airlock" "tear you in half" "break your bones" - "paralyse you" + "paralyze you" "take your credits" "sell you to the slave markets" "enslave you" @@ -6348,7 +6346,7 @@ phrase "hostile pirate" "sell you to Greenrock's fighting pits" "make you fight in the pits" "cover you in fire ants" - "operate on you without anaesthetic" + "operate on you without anesthetic" "cut your heart out" "use you as a test subject" "sacrifice you" diff --git a/data/human/human missions.txt b/data/human/human missions.txt index 7ff13684eb2d..6beffdd0d2c5 100644 --- a/data/human/human missions.txt +++ b/data/human/human missions.txt @@ -883,7 +883,7 @@ mission "Transport Workers C" payment payment 10000 dialog `You drop off the Pattersons, the farm family from , and help them to unload their wagon and cattle from your cargo hold. They thank you, and Jim pays you .` - log "Minor People" "Jim and Annette Patterson" `An unusual family who needed you to make a very unconventional trip with a sizeable number of farm animals that had to be kept happy in an enclosed area of your spaceship.` + log "Minor People" "Jim and Annette Patterson" `An unusual family who needed you to make a very unconventional trip with a sizable number of farm animals that had to be kept happy in an enclosed area of your spaceship.` @@ -3572,9 +3572,8 @@ mission "Pirate Duel" source near "Tarazed" 1 5 government "Republic" "Free Worlds" - waypoint "Umbral" + mark "Umbral" destination "Wayfarer" - to offer "combat rating" > 20 "combat rating" < 400 @@ -3631,18 +3630,64 @@ mission "Pirate Duel" on enter dialog `When you take off, you run a quick scan on all other ships that are taking off. You see no sign of the Esca. Maybe it's already waiting for you at Umbral.` on enter "Umbral" + unmark "Umbral" "reputation: Independent (Killable)" = -1000 conversation + branch "killed anglerfish" + has "anglerfish dead" + branch "disabled anglerfish" + has "anglerfish disabled" + branch "caught anglerfish" + has "anglerfish caught" `When you enter Umbral, you continue to see no sign of the Esca. Suddenly, an alarm rings out as your sensors detect that a pirate Vanguard has entered the system alongside you. Before you can respond, your ship intercepts a hail, and it opens communication.` ` The voice of the alleged captain of the Esca shouts out towards you. "Ho ho ho! Did you really think that I was the leader of the militia? Well, considering that you're here, I suppose you did. And now you'll pay for your mistake! Don't bother trying to call for help either, the militia don't patrol this system!"` ` The Vanguard powers up its weapons.` + decline + label "killed anglerfish" + `You enter Umbral, but see no sign of the Esca, as the "captain of the Esca" was killed. You should head back to Wayfarer to see if you can claim some sort of reward.` + decline + label "disabled anglerfish" + `You enter Umbral, but see no sign of the Esca, as the "captain of the Esca" was on the ship you disabled. You should head back to make sure the Anglerfish has been fully destroyed.` + decline + label "caught anglerfish" + action + clear "anglerfish caught" + `As you enter Umbral, the Anglerfish follows behind you, and opens a hail.` + ` "Did you think that if you went to Umbral, I would switch to a smaller ship? Ha!"` + ` The Anglerfish once again powers up its weapons.` + decline npc kill government "Independent (Killable)" personality heroic vindictive unconstrained launching confusion 20 ship "Vanguard (Plasma Slow)" "Anglerfish" - dialog `The Anglerfish and the "captain of the Esca" have been destroyed. You consider going back to Wayfarer to see if you can grab some sort of reward for your effort.` + on provoke + unmark "Umbral" + "reputation: Independent (Killable)" = -1000 + set "anglerfish caught" + conversation + `As soon as you open fire, the Anglerfish hails you.` + ` A voice you recognize as the "captain of the Esca" says, "How did you know that was me? Well, it doesn't matter, because I've paid off the militia. Get ready to die, small-fry."` + ` The Anglerfish powers up its weapons.` + decline + on disable + set "anglerfish disabled" + on kill + clear "anglerfish disabled" + set "anglerfish dead" + conversation + branch "orbiting tarazed" + has "flagship system: Tarazed" + branch "passed tarazed" + not "anglerfish caught" + `The Anglerfish and the "captain of the Esca" have been destroyed. You should continue on to Wayfarer to see if you can claim some sort of reward for your effort.` + decline + label "passed tarazed" + `The Anglerfish and the "captain of the Esca" have been destroyed. You should head back to Wayfarer to see if you can claim some sort of reward for your effort.` + decline + label "orbiting tarazed" + `The Anglerfish and the "captain of the Esca" have been destroyed. You should land on Wayfarer to see if you can claim some sort of reward for your effort.` on complete "reputation: Independent (Killable)" = 10 diff --git a/data/human/jobs.txt b/data/human/jobs.txt index aa79aca96d95..44c2cf58f3ab 100644 --- a/data/human/jobs.txt +++ b/data/human/jobs.txt @@ -3313,7 +3313,7 @@ mission "Bounty Hunting (Small, Local)" mission "Bounty Hunting (Medium)" name "Wanted pirate near " - description "A sizeable pirate warship named the has been attacking merchants a jump away from the system. Destroy it by for payment ()." + description "A sizable pirate warship named the has been attacking merchants a jump away from the system. Destroy it by for payment ()." repeat job deadline 14 @@ -3351,7 +3351,7 @@ mission "Bounty Hunting (Medium)" mission "Bounty Hunting (Medium, Local)" name "Wanted pirate entering " - description "A sizeable pirate warship named the has been attacking merchants in nearby star systems, and is reportedly entering this system. Destroy it by for payment ()." + description "A sizable pirate warship named the has been attacking merchants in nearby star systems, and is reportedly entering this system. Destroy it by for payment ()." repeat job deadline 3 diff --git a/data/human/news.txt b/data/human/news.txt index 364d9449a3f7..0801b05768a9 100644 --- a/data/human/news.txt +++ b/data/human/news.txt @@ -798,7 +798,7 @@ news "dentist" word `"` word - "Remember to pack a toothcleanser for your journey!" + "Remember to pack a toothcleaner for your journey!" "My new anti-cavity campaign is called 'Plaque Doesn't Deserve a Plaque.' Do you like it?" "If the galaxy has many alien species, I hope they all have teeth." "The advent of almost perfect artificial teeth may tempt you to stop caring if your natural teeth start to rot. Trust me that taking care of your teeth saves a lot of pain from both your mouth and your wallet." @@ -1006,7 +1006,6 @@ news "reporter" "Read this! 'The Real UGLIEST Starship that Lionheart Don't Want You to Know About!'" "Look at my new article! 'The Protector - Actually a SCAM?'" "Look at this! 'Five Reasons Why Captains Should Check Spaceports More Often - Number Two Will Make You Cry!'" - "Read my new article! 'Ten Things the Quarg Are Hiding from Us - Number Seven Will Surprise You!'" "Check this out! 'Top 20 Things Starship Pilots Don't Want You to Know!' Wait, never mind." "'11 signs that you are dealing with a corporate executive.' Read my blog to protect yourself from those psychopaths!" word diff --git a/data/kahet/kahet.txt b/data/kahet/kahet.txt index 595208e61dd4..a6ec73d32770 100644 --- a/data/kahet/kahet.txt +++ b/data/kahet/kahet.txt @@ -280,11 +280,8 @@ phrase "friendly ka'het" "" "1" "2" - "3" - "3" - "3" - "4" - "4" + "3" 3 + "4" 2 phrase "digit" phrase @@ -332,9 +329,7 @@ phrase "friendly ka'het" ". Estimated signal strength: " word "8" - "9" - "9" - "9" + "9" 3 phrase "digit" word diff --git a/data/map planets.txt b/data/map planets.txt index 1524d56bf8dc..009b7832bea8 100644 --- a/data/map planets.txt +++ b/data/map planets.txt @@ -863,7 +863,7 @@ planet Darkrest attributes hai station uninhabited landscape land/station34 description `This station was mothballed sometime in the last sixty thousand years. The docking area has an atmosphere, and a status panel indicates that the station's generators are functional but shut down, with standby mechanisms running on solar power alone.` - description ` An immediately obvious difference between this station and the others in Hai space is the presence of a solemn plaque that takes up a sizable portion of the nearest wall. Upon further inspection, it seems to commemorate an engineering malfunction that occurred thousands of years ago, when this station was still inhabited. In a freak accident, an entire habitation section of Darkrest lost power and depressurized, causing the deaths of countless civilians. Thousands of years later, no one knows for sure what caused the incident. Legends, stories, and conspiracy theories have blossomed from the event.` + description ` The presence of a solemn plaque that takes up a sizable portion of the nearest wall seems to commemorate an engineering malfunction that occurred thousands of years ago, when this station was still inhabited. In a freak accident, an entire habitation section of Darkrest lost power and depressurized, causing the deaths of countless civilians. Thousands of years later, no one knows for sure what caused the incident. Legends, stories, and conspiracy theories have blossomed from the event.` government Uninhabited bribe 0 security 0 @@ -1688,7 +1688,7 @@ planet "Garden Empyreal" attributes "coalition station" kimek shipping tourism wealthy landscape land/clouds_03 description `Not including the trio of Quarg ringworlds, this is the largest megastructure in Coalition space. Arrays of gigantic metal pyramids lay at every angle, each nearly a dozen times larger than the average space station. Spread out over the planet's upper atmosphere, these so-called "hubs" are connected by long, inextensible, and extremely sturdy wires, ensuring no part of the structure is destabilized.` - description ` First devised by the Kimek before the Coalition's war against the Quarg, the structure was completed relatively recently two thousand years ago. Populating the gas giant's uppermost atmosphere lay several hardy species of artificially engineered bacteria, periodically being "scooped" by the lower body of each hub and then later mass-produced into a nutritious soup.` + description ` First devised by the Kimek before the Coalition's war against the Quarg, the structure was completed relatively recently, about two thousand years ago. Populating the gas giant's uppermost atmosphere lay several hardy species of artificially engineered bacteria, periodically being "scooped" by the lower body of each hub and then later mass-produced into a nutritious soup.` spaceport `When not in "harvest season," the hubs are relatively quiet, and serve mostly as a tourist destination. Many come for the unique, close-up view of a sea of clouds, swarming with furious storms and dotted with more of the silver pyramids in the distance.` spaceport ` Each hub shares the same overall design in general, but the decoration pieces, services, and local amenities for each one have grown in their own way over the centuries. The only common thing they have between all of them is the signature restaurant, which serves a variety of dishes, drinks, and even desserts all based on the processed, scooped up produce.` "required reputation" 20 @@ -4296,7 +4296,7 @@ planet Stonebreak planet Stormhold attributes core "core pirate" forest frontier pirate landscape land/fog11 - description `A cold planet, with dense, foggy atmosphere. As with many pirate outposts, Stormhold is home to an unknown number of villages and hidden outposts, each controlled by a different pirate faction. It is also said that some of the most dangerous fugitives in the galaxy live deep in the forests of this planet, escaping detection by living underground or by avoiding the use of electronic devices.` + description `Stormhold is a cold planet, with a dense, foggy atmosphere. As with many pirate outposts, Stormhold is home to an unknown number of villages and hidden outposts, each controlled by a different pirate faction. It is also said that some of the most dangerous fugitives in the galaxy live deep in the forests of this planet, escaping detection by living underground or by avoiding the use of electronic devices.` spaceport `The spaceport is a large town, with a population of roughly thirty thousand. People of all races and cultures mingle freely, while keeping a wary eye open for off-worlders who may be Republic agents in disguise.` outfitter "Basic Outfits" outfitter "Ammo North" diff --git a/data/persons.txt b/data/persons.txt index 254981819eef..f866bc1324fa 100644 --- a/data/persons.txt +++ b/data/persons.txt @@ -548,8 +548,7 @@ person "Power of the People" "Take it from me: " "A word of caution: " "A piece of advice: " - "" - "" + "" 2 word "If you think the other guy might have a blaster hidden under the table... bring two blasters." "I'm a team player. As long as the rest of the team stays behind me." diff --git a/data/pug/pug.txt b/data/pug/pug.txt index a7d5063d5243..2457a7b16ae2 100644 --- a/data/pug/pug.txt +++ b/data/pug/pug.txt @@ -29,7 +29,7 @@ phrase "pug" "Klar" "Brek" word - " " + " " 3 " Kim " " Wor " " Moof " @@ -43,8 +43,6 @@ phrase "pug" " a " " io " " el " - " " - " " word "Glorf" "Florp" diff --git a/data/quarg/quarg news.txt b/data/quarg/quarg news.txt index 1b9d22c65857..5cd5814940a2 100644 --- a/data/quarg/quarg news.txt +++ b/data/quarg/quarg news.txt @@ -31,7 +31,7 @@ news "anonymous quarg" word "a merchant" "a merchant captain" - "a travelling merchant" + "a traveling merchant" "a captain" word "?" diff --git a/data/remnant/remnant 2 side missions.txt b/data/remnant/remnant 2 side missions.txt index dbb621543440..2dbe389942a1 100644 --- a/data/remnant/remnant 2 side missions.txt +++ b/data/remnant/remnant 2 side missions.txt @@ -715,7 +715,7 @@ mission "Remnant: Will Not Someone Please Think Of The Children" minor landing name "Sympathy For The Korath" - description "Travel to the system to disable a stranded Kas'lor Ik 582. Do not destroy or capture the ship, as it likely has a large civilian population." + description "Travel to the system to disable a stranded Dathnak A'awoj. Do not destroy or capture the ship, as it likely has a large civilian population." source government "Remnant" waypoint "Vaticanus" @@ -730,7 +730,7 @@ mission "Remnant: Will Not Someone Please Think Of The Children" on offer conversation `You step out of your airlock to find Prefect Chilia waiting for you with a worried look on his face. "Captain , I have a sensitive request for you.` - ` "Our scouts are reporting a stranded Korath ship in Vaticanus, a Kas'lor Ik 582 to be precise. If it were a typical warship obstructing our operations, we would request you track it down and eliminate it, but because ships of this type tend to be home to a large civilian population, destroying or capturing it outright may instigate a reprisal, especially in that sector.` + ` "Our scouts are reporting a stranded Korath ship in Vaticanus, a Dathnak A'awoj to be precise. If it were a typical warship obstructing our operations, we would request you track it down and eliminate it, but because ships of this type tend to be home to a large civilian population, destroying or capturing it outright may instigate a reprisal, especially in that sector.` ` "Would you be up for disabling it, so the threat is eliminated while preserving the lives of the innocents on board?" His signs shift from a questioning tone to a confident one. "After you are done we can disarm the ship and fix their jump drive. If they adhere to their typical doctrine they should decide to head back home."` choice ` "Happy to help those in need, even the Korath."` @@ -761,7 +761,7 @@ mission "Remnant: Will Not Someone Please Think Of The Children" dialog `The Remnant are puzzled at your aborting of this mission, but they tell you they will send someone else to do this work. They warn you they will not propose any more of the sort to you again.` on fail "reputation: Remnant" -= 250 - dialog `You were unable to disable the Kas'lor Ik 582 without destroying it... The Remnant will not be pleased...` + dialog `You were unable to disable the Dathnak A'awoj without destroying it... The Remnant will not be pleased...` on complete "remnant: disable and save count" ++ payment 2500000 diff --git a/data/remnant/remnant jobs.txt b/data/remnant/remnant jobs.txt index 213ed74b8b56..0b659ed7d3bb 100644 --- a/data/remnant/remnant jobs.txt +++ b/data/remnant/remnant jobs.txt @@ -667,8 +667,8 @@ mission "Remnant: Rescue 5" mission "Remnant: Disable 1" job repeat - name "Disable Damaged Kas'lor Ik 582" - description "A damaged Kas'lor Ik 582 is stuck in a newly accessible system, near Postverta. It has a large civilian population so we ask you to only disable it to avoid an atrocity. Once you return to you will receive a logistics adjustment of ." + name "Disable Damaged Dathnak A'awoj" + description "A damaged Dathnak A'awoj is stuck in a newly accessible system, near Postverta. It has a large civilian population so we ask you to only disable it to avoid an atrocity. Once you return to you will receive a logistics adjustment of ." source government "Remnant" to offer @@ -685,15 +685,15 @@ mission "Remnant: Disable 1" names "korath" variant "Kas'lor Ik 582 (Stranded)" - dialog `You have disabled the Kas'lor Ik 582. Time to report back to .` + dialog `You have disabled the Dathnak A'awoj. Time to report back to .` on visit - dialog `You've landed on , but the stuck Kas'lor Ik 582 has not been disabled yet. Hunt it down and disable it before returning.` + dialog `You've landed on , but the stuck Dathnak A'awoj has not been disabled yet. Hunt it down and disable it before returning.` on abort dialog `The Remnant are puzzled at your aborting of this mission, but they tell you they will send someone else to do this work. They advise you they will prioritize other teams for these missions in the future.` on fail "reputation: Remnant" -= 250 - dialog `You were unable to disable the Kas'lor Ik 582 without destroying it... The Remnant will not be pleased...` + dialog `You were unable to disable the Dathnak A'awoj without destroying it... The Remnant will not be pleased...` on complete "remnant: disable and save count" ++ payment 2000000 - dialog "A Remnant military prefect thanks you for disabling down the Kas'lor Ik 582 , and gives you the agreed-upon logistics adjustment of ." + dialog "A Remnant military prefect thanks you for disabling the Dathnak A'awoj , and gives you the agreed-upon logistics adjustment of ." diff --git a/data/sheragi/archaeology missions.txt b/data/sheragi/archaeology missions.txt index db9e2dfc9aad..eaf618288067 100644 --- a/data/sheragi/archaeology missions.txt +++ b/data/sheragi/archaeology missions.txt @@ -1574,7 +1574,7 @@ mission "Sheragi Archaeology: The Emerald Sword 3" ` "Did that happen with the last one?"` goto last - ` Your questions is met with a chorus of "No, I'm fine," "All good over here," and various other affirmations of safety from the crew.` + ` Your question is met with a chorus of "No, I'm fine," "All good over here," and various other affirmations of safety from the crew.` goto desyoend label last diff --git a/data/wanderer/wanderer missions.txt b/data/wanderer/wanderer missions.txt index a039aa63a211..469167b0dbed 100644 --- a/data/wanderer/wanderer missions.txt +++ b/data/wanderer/wanderer missions.txt @@ -152,7 +152,7 @@ mission "Wanderers: Mereti: The Plant 5" "Strong Wind" event "mereti visiting eneremprukt" - system eneremprukt + system Eneremprukt fleet "Small Kor Mereti" 800 event "field of mereti plants" diff --git a/data/wanderer/wanderer news.txt b/data/wanderer/wanderer news.txt index 1ca058861c7d..824c1c01d847 100644 --- a/data/wanderer/wanderer news.txt +++ b/data/wanderer/wanderer news.txt @@ -90,7 +90,7 @@ news "Wanderers and Aliens" "I have heard that Hai and human space are [linked, joined] with a wormhole. Could it have been made by [our caretakers, those that open the Eye]?" "The Unfettered Hai enter Wanderer [space, territory] using jump drives. Where did they get such [devices, technology]?" "Our species has [met, made contact] with many aliens before, but never so many at once." - "Exploration is important for a society. If we did not move and discover new planets, we would have [stagnated, shrivelled] long ago." + "Exploration is important for a society. If we did not move and discover new planets, we would have [stagnated, shriveled] long ago." "I can [sympathize with, understand] the Hai. They have been [stuck, stagnant] in their own space for too long. It is only [right, natural] that they should want to [migrate to, leave for] new lands." word `"` diff --git a/data/wanderer/wanderers middle.txt b/data/wanderer/wanderers middle.txt index 50134ea6bf06..225400684e7c 100644 --- a/data/wanderer/wanderers middle.txt +++ b/data/wanderer/wanderers middle.txt @@ -1004,7 +1004,7 @@ mission "Wanderers: Mind Escorts" variant "Hurricane" 2 "Derecho" 3 - "Tempest" 4 + "Tempest" 5 mission "Wanderers: Mind 4" landing @@ -1127,9 +1127,9 @@ mission "Wanderers: Mind 6" variant "Model 512" 3 "Model 256" 4 - "Model 128" 5 - "Model 64" 6 - "Model 32" 8 + "Model 128" 4 + "Model 64" 5 + "Model 32" 7 "Model 16" 12 dialog `The last of the hostile Kor Mereti drones are destroyed; the remaining drones are not attacking the Wanderers. It is not entirely clear what has happened, but hopefully the Wanderers back on will have gained some information through the backdoor connection to their AI.` npc @@ -1139,10 +1139,10 @@ mission "Wanderers: Mind 6" names "kor mereti" variant "Model 256" 1 - "Model 128" 2 + "Model 128" 1 "Model 64" 3 "Model 32" 5 - "Model 16" 8 + "Model 16" 10 on visit dialog `You've landed on , but there are still hostile Kor Mereti drones in the Chimitarp system. Better depart and make sure they've been taken care of.` diff --git a/data/wanderer/wanderers.txt b/data/wanderer/wanderers.txt index 370af02b7f09..32233569f657 100644 --- a/data/wanderer/wanderers.txt +++ b/data/wanderer/wanderers.txt @@ -253,9 +253,7 @@ phrase "wanderer untranslated" " v'" " va'" "'a iy cha'" - " " - " " - " " + " " 3 word "akai'" "ar" @@ -294,8 +292,7 @@ phrase "wanderer untranslated" " sek " " iy " " salek " - " " - " " + " " 2 word "reku'" "sarka'" @@ -321,9 +318,7 @@ phrase "wanderer untranslated" "a'uk" "echa" word - "." - "." - "." + "." 3 "'i." "'ai." " eku." @@ -529,9 +524,7 @@ phrase "friendly disabled wanderer" word ", please" ", we beg you" - "" - "" - "" + "" 3 word "." "!" diff --git a/endless-sky.6 b/endless-sky.6 index 5d938e521658..0a7c912db1f7 100644 --- a/endless-sky.6 +++ b/endless-sky.6 @@ -1,4 +1,4 @@ -.TH endless\-sky 6 "25 May 2024" "ver. 0.10.7" "Endless Sky" +.TH endless\-sky 6 "22 Jun 2024" "ver. 0.10.8" "Endless Sky" .SH NAME endless\-sky \- a space exploration and combat game. diff --git a/images/ui/mission empty.png b/images/ui/mission empty.png new file mode 100644 index 000000000000..9e96f4fa83a7 Binary files /dev/null and b/images/ui/mission empty.png differ diff --git a/io.github.endless_sky.endless_sky.appdata.xml b/io.github.endless_sky.endless_sky.appdata.xml index a6b2f95b2e71..ce4c7d8dadfe 100644 --- a/io.github.endless_sky.endless_sky.appdata.xml +++ b/io.github.endless_sky.endless_sky.appdata.xml @@ -60,6 +60,22 @@ + + +

This is a stable release, focused on fixing bugs and making some other small improvements.

+

These changes include:

+
    +
  • Fixed various crashes, including ones that could occur when sorting ships or when using the flagship outline or new cloaked settings.
  • +
  • The flagship will no longer move through wormholes ahead of escorts when using fleet jumping.
  • +
  • Reduced the difficulty of the battle in "Wanderers: Mind 6".
  • +
  • Added a gamerule for controlling the disabled fighter projectile collision behavior introduced in v0.10.7.
  • +
  • Illegal mission passengers can now be detected by planetary security. Previously, missions with only illegal passengers could never result in a fine.
  • +
+

You can find out more in the changelog.

+

Special thanks to the 13 people who contributed to this release!

+
+ https://github.com/endless-sky/endless-sky/blob/v0.10.8/changelog +

This is an unstable release, containing big changes that may introduce new bugs.

diff --git a/resources/EndlessSky-Info.plist b/resources/EndlessSky-Info.plist index a76be47e9bb1..3a4f6a51238c 100644 --- a/resources/EndlessSky-Info.plist +++ b/resources/EndlessSky-Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.10.7 + 0.10.8 CFBundleSignature ???? CFBundleVersion diff --git a/source/AI.cpp b/source/AI.cpp index ecb3486df7dc..51f0c5a82952 100644 --- a/source/AI.cpp +++ b/source/AI.cpp @@ -18,6 +18,7 @@ this program. If not, see . #include "Audio.h" #include "Command.h" #include "DistanceMap.h" +#include "FighterHitHelper.h" #include "Flotsam.h" #include "GameData.h" #include "Gamerules.h" @@ -106,6 +107,25 @@ namespace { return true; } + bool EscortsReadyToLand(const Ship &ship) + { + bool shipIsYours = ship.IsYours(); + const Government *gov = ship.GetGovernment(); + for(const weak_ptr &ptr : ship.GetEscorts()) + { + shared_ptr escort = ptr.lock(); + // Skip escorts which are not player-owned and not escort mission NPCs. + if(!escort || (shipIsYours && !escort->IsYours() && (!escort->GetPersonality().IsEscort() + || gov->IsEnemy(escort->GetGovernment())))) + continue; + if(escort->IsDisabled()) + continue; + if(escort->GetTargetStellar() == ship.GetTargetStellar() && !escort->CanLand()) + return false; + } + return true; + } + // Determine if the ship has any usable weapons. bool IsArmed(const Ship &ship) { @@ -667,7 +687,7 @@ void AI::Step(Command &activeCommands) // focus on damaging one particular ship. targetTurn = (targetTurn + 1) & 31; if(targetTurn == step || !target || target->IsDestroyed() || (target->IsDisabled() && - (personality.Disables() || (target->CanBeCarried() && !personality.IsVindictive()))) + (personality.Disables() || (!FighterHitHelper::IsValidTarget(target.get()) && !personality.IsVindictive()))) || (target->IsFleeing() && personality.IsMerciful()) || !target->IsTargetable()) { target = FindTarget(*it); @@ -3656,6 +3676,9 @@ void AI::AutoFire(const Ship &ship, FireCommand &command, bool secondary, bool i // Merciful ships let fleeing ships go. if(target->IsFleeing() && person.IsMerciful()) continue; + // Don't hit ships that cannot be hit without targeting + if(target != currentTarget.get() && !FighterHitHelper::IsValidTarget(target)) + continue; Point p = target->Position() - start; Point v = target->Velocity(); @@ -4477,6 +4500,9 @@ void AI::MovePlayer(Ship &ship, Command &activeCommands) if(autoPilot.Has(Command::LAND) || (autoPilot.Has(Command::JUMP | Command::FLEET_JUMP) && isWormhole)) { + if(activeCommands.Has(Command::WAIT) || (autoPilot.Has(Command::FLEET_JUMP) && !EscortsReadyToLand(ship))) + command |= Command::WAIT; + if(ship.GetPlanet()) autoPilot.Clear(Command::LAND | Command::JUMP | Command::FLEET_JUMP); else diff --git a/source/AmmoDisplay.cpp b/source/AmmoDisplay.cpp index d05bb87df97c..f0f5d1d0c054 100644 --- a/source/AmmoDisplay.cpp +++ b/source/AmmoDisplay.cpp @@ -39,9 +39,16 @@ AmmoDisplay::AmmoDisplay(PlayerInfo &player) -void AmmoDisplay::Update(const Ship &flagship) +void AmmoDisplay::Reset() { ammo.clear(); +} + + + +void AmmoDisplay::Update(const Ship &flagship) +{ + Reset(); for(const auto &it : flagship.Weapons()) { const Outfit *secWeapon = it.GetOutfit(); diff --git a/source/AmmoDisplay.h b/source/AmmoDisplay.h index e8751e5316c2..03aa37d2a329 100644 --- a/source/AmmoDisplay.h +++ b/source/AmmoDisplay.h @@ -33,6 +33,7 @@ class Ship; class AmmoDisplay { public: explicit AmmoDisplay(PlayerInfo &player); + void Reset(); void Update(const Ship &flagship); void Draw(const Rectangle &ammoBox, const Point &iconDimensions) const; bool Click(const Point &clickPoint, bool control); diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 76fa4cb29cec..bffa1f0beb6c 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -108,6 +108,7 @@ target_sources(EndlessSkyLib PRIVATE EscortDisplay.cpp EscortDisplay.h ExclusiveItem.h + FighterHitHelper.h File.cpp File.h Files.cpp diff --git a/source/CargoHold.cpp b/source/CargoHold.cpp index 97ce906bdcb2..30e3d5564a12 100644 --- a/source/CargoHold.cpp +++ b/source/CargoHold.cpp @@ -610,16 +610,24 @@ int CargoHold::IllegalCargoFine(const Government *government, const PlayerInfo & // and avoid the bulk of the penalties when fined. for(const auto &it : missionCargo) { - int fine = it.first->IllegalCargoFine(); + int fine = it.first->Fine(); if(fine < 0) return fine; if(!it.first->IsFailed(player)) totalFine += fine; } + return totalFine; +} + + + +int CargoHold::IllegalPassengersFine(const Government *government, const PlayerInfo &player) const +{ + int totalFine = 0; for(const auto &it : passengers) { - int fine = it.first->IllegalCargoFine(); + int fine = it.first->Fine(); if(fine < 0) return fine; if(!it.first->IsFailed(player)) @@ -643,7 +651,7 @@ int CargoHold::IllegalCargoAmount() const // Find any illegal mission cargo. for(const auto &it : missionCargo) - if(it.first->IllegalCargoFine()) + if(it.first->Fine()) count += it.second; return count; diff --git a/source/CargoHold.h b/source/CargoHold.h index 5c8d4d069d13..87b59f4174cb 100644 --- a/source/CargoHold.h +++ b/source/CargoHold.h @@ -108,9 +108,10 @@ class CargoHold { // If anything you are carrying is illegal, return the maximum fine you can // be charged for any illegal outfits plus the sum of the fines for all - // missions. If the returned value is negative, you are carrying something so - // bad that it warrants a death sentence. + // missions. If the returned value is negative, you are carrying something + // or someone that warrants a death sentence for you. int IllegalCargoFine(const Government *government, const PlayerInfo &player) const; + int IllegalPassengersFine(const Government *government, const PlayerInfo &player) const; // Returns the amount tons of illegal cargo. int IllegalCargoAmount() const; diff --git a/source/ConditionsStore.h b/source/ConditionsStore.h index 216663fd69df..19b3dd5fdacd 100644 --- a/source/ConditionsStore.h +++ b/source/ConditionsStore.h @@ -76,7 +76,7 @@ class ConditionsStore { }; - // Storage entry for a condition. Can act as a int64_t proxy when operator[] is used for access + // Storage entry for a condition. Can act as an int64_t proxy when operator[] is used for access // to conditions in the ConditionsStore. class ConditionEntry { friend ConditionsStore; diff --git a/source/DataFile.cpp b/source/DataFile.cpp index db076888d031..b70095893cbf 100644 --- a/source/DataFile.cpp +++ b/source/DataFile.cpp @@ -109,7 +109,13 @@ void DataFile::LoadData(const string &data) size_t lineNumber = 0; size_t end = data.length(); - for(size_t pos = 0; pos < end; ) + + size_t pos = 0; + // If the first character is the UTF8 byte order mark (BOM), skip it. + if(!Utf8::IsBOM(Utf8::DecodeCodePoint(data, pos))) + pos = 0; + + while(pos < end) { ++lineNumber; size_t tokenPos = pos; diff --git a/source/DataNode.cpp b/source/DataNode.cpp index 9042edc285dc..2c22e23c7a3a 100644 --- a/source/DataNode.cpp +++ b/source/DataNode.cpp @@ -307,7 +307,7 @@ int DataNode::PrintTrace(const string &message) const { if(&token != &tokens.front()) line += ' '; - bool hasSpace = any_of(token.begin(), token.end(), [](char c) { return isspace(c); }); + bool hasSpace = any_of(token.begin(), token.end(), [](unsigned char c) { return isspace(c); }); bool hasQuote = any_of(token.begin(), token.end(), [](char c) { return (c == '"'); }); if(hasSpace) line += hasQuote ? '`' : '"'; diff --git a/source/DataWriter.cpp b/source/DataWriter.cpp index 350903ec043f..493e54572c6e 100644 --- a/source/DataWriter.cpp +++ b/source/DataWriter.cpp @@ -130,7 +130,7 @@ void DataWriter::WriteToken(const char *a) void DataWriter::WriteToken(const string &a) { // Figure out what kind of quotation marks need to be used for this string. - bool hasSpace = any_of(a.begin(), a.end(), [](char c) { return isspace(c); }); + bool hasSpace = any_of(a.begin(), a.end(), [](unsigned char c) { return isspace(c); }); bool hasQuote = any_of(a.begin(), a.end(), [](char c) { return (c == '"'); }); // If the token is an empty string, it needs to be wrapped in quotes as if it had a space. hasSpace |= a.empty(); diff --git a/source/DistanceMap.cpp b/source/DistanceMap.cpp index 1fb467dfb925..156da9592a7d 100644 --- a/source/DistanceMap.cpp +++ b/source/DistanceMap.cpp @@ -212,7 +212,7 @@ void DistanceMap::Init(const Ship *ship) } } - // Find the route with lowest fuel use. If multiple routes use the same fuel, + // Find the route with the lowest fuel use. If multiple routes use the same fuel, // choose the one with the fewest jumps (i.e. using jump drive rather than // hyperdrive). If multiple routes have the same fuel and the same number of // jumps, break the tie by using how "dangerous" the route is. diff --git a/source/Engine.cpp b/source/Engine.cpp index 19be6e7a647e..b6c6a8dffdcb 100644 --- a/source/Engine.cpp +++ b/source/Engine.cpp @@ -25,6 +25,7 @@ this program. If not, see . #include "DamageDealt.h" #include "DamageProfile.h" #include "Effect.h" +#include "FighterHitHelper.h" #include "FillShader.h" #include "Fleet.h" #include "Flotsam.h" @@ -690,6 +691,8 @@ void Engine::Step(bool isActive) // Update the player's ammo amounts. if(flagship) ammoDisplay.Update(*flagship); + else + ammoDisplay.Reset(); // Display escort information for all ships of the "Escort" government, // and all ships with the "escort" personality, except for fighters that @@ -1119,6 +1122,8 @@ void Engine::Draw() const for(const auto &outline : outlines) { + if(!outline.sprite) + continue; Point size(outline.sprite->Width(), outline.sprite->Height()); OutlineShader::Draw(outline.sprite, outline.position, size, outline.color, outline.unit, outline.frame); } @@ -2501,7 +2506,7 @@ void Engine::DoCollisions(Projectile &projectile) // Don't collide with carried ships that are disabled and not directly targeted. if(shipHit && hit != projectile.Target() - && shipHit->CanBeCarried() && shipHit->IsDisabled()) + && !FighterHitHelper::IsValidTarget(shipHit.get())) continue; // If the ship is cloaked, and phasing, then skip this ship (during this step). @@ -2645,7 +2650,7 @@ void Engine::DoCollection(Flotsam &flotsam) // you'll be pushing the flotsam away from your ship, but the pull of the tractor beam // will still slowly close the distance between the ship and the flotsam. // When dealing with multiple ships, this causes a better appearance of a struggle between - // the ships all trying to get ahold of the flotsam should the ships all have similar velocities. + // the ships all trying to get a hold of the flotsam should the ships all have similar velocities. // If the ships have differing velocities, then it can make it look like the quicker ship is // yanking the flotsam away from the slower ship. pullVector += avgShipVelocity / count; @@ -2662,7 +2667,7 @@ void Engine::DoCollection(Flotsam &flotsam) return; if(collector == player.Flagship() && flotsamSetting == Preferences::FlotsamCollection::ESCORT) return; - if(flotsamSetting == Preferences::FlotsamCollection::FLAGSHIP) + if(collector != player.Flagship() && flotsamSetting == Preferences::FlotsamCollection::FLAGSHIP) return; } diff --git a/source/FighterHitHelper.h b/source/FighterHitHelper.h new file mode 100644 index 000000000000..474861eb8dd1 --- /dev/null +++ b/source/FighterHitHelper.h @@ -0,0 +1,43 @@ +/* FighterHitHelper.h +Copyright (c) 2024 by tibetiroka + +Endless Sky is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later version. + +Endless Sky is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . +*/ + +#ifndef FIGHTER_HIT_POLICY_H_ +#define FIGHTER_HIT_POLICY_H_ + +#include "GameData.h" +#include "Gamerules.h" +#include "Ship.h" + + + +class FighterHitHelper +{ +public: + // Checks whether the given ship is a valid target for non-targeted projectiles. + static inline bool IsValidTarget(const Ship *ship) + { + if(!ship->CanBeCarried() || !ship->IsDisabled()) + return true; + switch(GameData::GetGamerules().FightersHitWhenDisabled()) + { + case Gamerules::FighterDodgePolicy::ALL: return false; + case Gamerules::FighterDodgePolicy::NONE: return true; + case Gamerules::FighterDodgePolicy::ONLY_PLAYER: return !ship->IsYours(); + } + return false; + } +}; + +#endif diff --git a/source/GameAction.cpp b/source/GameAction.cpp index faa0b0b6f384..b48161b746d1 100644 --- a/source/GameAction.cpp +++ b/source/GameAction.cpp @@ -58,7 +58,7 @@ namespace { string message; if(isSingle) { - char c = tolower(nameWas.front()); + char c = tolower(static_cast(nameWas.front())); bool isVowel = (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'); message = (isVowel ? "An " : "A "); } diff --git a/source/Gamerules.cpp b/source/Gamerules.cpp index 5573b603d618..376d08cd8862 100644 --- a/source/Gamerules.cpp +++ b/source/Gamerules.cpp @@ -54,6 +54,18 @@ void Gamerules::Load(const DataNode &node) depreciationGracePeriod = max(0, child.Value(1)); else if(key == "depreciation max age") depreciationMaxAge = max(0, child.Value(1)); + else if(key == "disabled fighters avoid projectiles") + { + const string &value = child.Token(1); + if(value == "all") + fighterHitPolicy = FighterDodgePolicy::ALL; + else if(value == "none") + fighterHitPolicy = FighterDodgePolicy::NONE; + else if(value == "only player") + fighterHitPolicy = FighterDodgePolicy::ONLY_PLAYER; + else + child.PrintTrace("Skipping unrecognized value for gamerule:"); + } else child.PrintTrace("Skipping unrecognized gamerule:"); } @@ -121,3 +133,10 @@ int Gamerules::DepreciationMaxAge() const { return depreciationMaxAge; } + + + +Gamerules::FighterDodgePolicy Gamerules::FightersHitWhenDisabled() const +{ + return fighterHitPolicy; +} diff --git a/source/Gamerules.h b/source/Gamerules.h index 5e731ad929d0..00ce92dde86f 100644 --- a/source/Gamerules.h +++ b/source/Gamerules.h @@ -23,6 +23,14 @@ class DataNode; // Gamerules contains a list of constants and booleans that define game behavior, // for example, the spawnrate of person ships or whether universal ramscoops are active. class Gamerules { +public: + // Defines which disabled fighters can dodge stray projectiles. + enum class FighterDodgePolicy + { + ALL, NONE, ONLY_PLAYER + }; + + public: Gamerules() = default; @@ -38,6 +46,7 @@ class Gamerules { double DepreciationDaily() const; int DepreciationGracePeriod() const; int DepreciationMaxAge() const; + FighterDodgePolicy FightersHitWhenDisabled() const; private: @@ -50,6 +59,7 @@ class Gamerules { double depreciationDaily = 0.997; int depreciationGracePeriod = 7; int depreciationMaxAge = 1000; + FighterDodgePolicy fighterHitPolicy = FighterDodgePolicy::ALL; }; diff --git a/source/Government.h b/source/Government.h index a1923eb55ad7..359dcda63ed1 100644 --- a/source/Government.h +++ b/source/Government.h @@ -41,7 +41,7 @@ class System; // Class representing a government. Each ship belongs to some government, and -// attacking that ship will provoke its ally governments and reduce your +// attacking that ship will provoke its allied governments and reduce your // reputation with them, but increase your reputation with that ship's enemies. // The ships for each government are identified by drawing them with a different // color "swizzle." Some government's ships can also be easier or harder to @@ -183,7 +183,7 @@ class Government { bool provokedOnScan = false; // If a government appears in this set, and the reputation with this government is affected by actions, // and events performed against that government, use the penalties that government applies for the - // action instead of this governments own penalties. + // action instead of this government's own penalties. std::set useForeignPenaltiesFor; }; diff --git a/source/Interface.cpp b/source/Interface.cpp index 23f41ec5b653..309210c826a2 100644 --- a/source/Interface.cpp +++ b/source/Interface.cpp @@ -567,7 +567,7 @@ Interface::TextElement::TextElement(const DataNode &node, const Point &globalAnc // This function will call ParseLine() for any line it does not recognize. Load(node, globalAnchor); - // Fill in any undefined state colors. By default labels are "medium", strings + // Fill in any undefined state colors. By default, labels are "medium", strings // are "bright", and button brightness depends on its activation state. if(!color[Element::ACTIVE] && !buttonKey && command == Command::NONE) color[Element::ACTIVE] = GameData::Colors().Get(isDynamic ? "bright" : "medium"); diff --git a/source/MainPanel.cpp b/source/MainPanel.cpp index 9d0c1e06ab0c..6fec429b85e8 100644 --- a/source/MainPanel.cpp +++ b/source/MainPanel.cpp @@ -78,6 +78,10 @@ void MainPanel::Step() // checks only already-drawn panels. bool isActive = GetUI()->IsTop(this); + // If the player is dead, don't show anything. + if(player.IsDead()) + show = Command::NONE; + // Display any requested panels. if(show.Has(Command::MAP)) { @@ -334,6 +338,9 @@ Engine &MainPanel::GetEngine() // Only override the ones you need; the default action is to return false. bool MainPanel::KeyDown(SDL_Keycode key, Uint16 mod, const Command &command, bool isNewPress) { + if(player.IsDead()) + return true; + if(command.Has(Command::MAP | Command::INFO | Command::MESSAGE_LOG | Command::HAIL | Command::HELP)) show = command; else if(command.Has(Command::TURRET_TRACKING)) diff --git a/source/Mission.cpp b/source/Mission.cpp index db5206663a5f..d8cfdb259c5b 100644 --- a/source/Mission.cpp +++ b/source/Mission.cpp @@ -361,8 +361,8 @@ void Mission::Save(DataWriter &out, const string &tag) const out.Write("passengers", passengers); if(paymentApparent) out.Write("apparent payment", paymentApparent); - if(illegalCargoFine) - out.Write("illegal", illegalCargoFine, illegalCargoMessage); + if(fine) + out.Write("illegal", fine, fineMessage); if(failIfDiscovered) out.Write("stealth"); if(!isVisible) @@ -690,16 +690,16 @@ int Mission::CargoSize() const -int Mission::IllegalCargoFine() const +int Mission::Fine() const { - return illegalCargoFine; + return fine; } -string Mission::IllegalCargoMessage() const +string Mission::FineMessage() const { - return illegalCargoMessage; + return fineMessage; } @@ -1191,7 +1191,7 @@ void Mission::Do(const ShipEvent &event, PlayerInfo &player, UI *ui) if(event.TargetGovernment()->IsPlayer() && !hasFailed) { bool failed = false; - string message = "Your ship \"" + event.Target()->Name() + "\" has been "; + string message; if(event.Type() & ShipEvent::DESTROY) { // Destroyed ships carrying mission cargo result in failed missions. @@ -1201,8 +1201,6 @@ void Mission::Do(const ShipEvent &event, PlayerInfo &player, UI *ui) // If any mission passengers were present, this mission is failed. for(const auto &it : event.Target()->Cargo().PassengerList()) failed |= (it.first == this && it.second); - if(failed) - message += "lost. "; } else if(event.Type() & ShipEvent::BOARD) { @@ -1210,7 +1208,8 @@ void Mission::Do(const ShipEvent &event, PlayerInfo &player, UI *ui) for(const auto &it : event.Actor()->Cargo().MissionCargo()) failed |= (it.first == this); if(failed) - message += "plundered. "; + message = "Your " + event.Target()->DisplayModelName() + + " \"" + event.Target()->Name() + "\" has been plundered. "; } if(failed) @@ -1389,8 +1388,8 @@ Mission Mission::Instantiate(const PlayerInfo &player, const shared_ptr &b result.passengers = passengers; } result.paymentApparent = paymentApparent; - result.illegalCargoFine = illegalCargoFine; - result.illegalCargoMessage = Phrase::ExpandPhrases(illegalCargoMessage); + result.fine = fine; + result.fineMessage = Phrase::ExpandPhrases(fineMessage); result.failIfDiscovered = failIfDiscovered; result.distanceCalcSettings = distanceCalcSettings; @@ -1630,11 +1629,11 @@ bool Mission::Enter(const System *system, PlayerInfo &player, UI *ui) bool Mission::ParseContraband(const DataNode &node) { if(node.Token(0) == "illegal" && node.Size() == 2) - illegalCargoFine = node.Value(1); + fine = node.Value(1); else if(node.Token(0) == "illegal" && node.Size() == 3) { - illegalCargoFine = node.Value(1); - illegalCargoMessage = node.Token(2); + fine = node.Value(1); + fineMessage = node.Token(2); } else if(node.Token(0) == "stealth") failIfDiscovered = true; diff --git a/source/Mission.h b/source/Mission.h index 1994d69b5857..e3474e991429 100644 --- a/source/Mission.h +++ b/source/Mission.h @@ -103,8 +103,8 @@ class Mission { void Unmark(const System *system) const; const std::string &Cargo() const; int CargoSize() const; - int IllegalCargoFine() const; - std::string IllegalCargoMessage() const; + int Fine() const; + std::string FineMessage() const; bool FailIfDiscovered() const; int Passengers() const; int64_t DisplayedPayment() const; @@ -224,8 +224,8 @@ class Mission { // Parameters for generating random cargo amounts: int cargoLimit = 0; double cargoProb = 0.; - int illegalCargoFine = 0; - std::string illegalCargoMessage; + int fine = 0; + std::string fineMessage; bool failIfDiscovered = false; int passengers = 0; // Parameters for generating random passenger amounts: diff --git a/source/MissionPanel.cpp b/source/MissionPanel.cpp index 33059a034d63..feb4bd84cae5 100644 --- a/source/MissionPanel.cpp +++ b/source/MissionPanel.cpp @@ -1013,6 +1013,9 @@ void MissionPanel::DrawMissionInfo() else if(acceptedIt != accepted.end()) info.SetCondition("can abort"); + if(availableIt != available.end() || acceptedIt != accepted.end()) + info.SetCondition("has description"); + info.SetString("cargo free", to_string(player.Cargo().Free()) + " tons"); info.SetString("bunks free", to_string(player.Cargo().BunksFree()) + " bunks"); diff --git a/source/NPC.cpp b/source/NPC.cpp index 7d2b119386ca..1df57e75fd0f 100644 --- a/source/NPC.cpp +++ b/source/NPC.cpp @@ -515,7 +515,8 @@ void NPC::Do(const ShipEvent &event, PlayerInfo &player, UI *ui, const Mission * // Check if the success status has changed. If so, display a message. if(isVisible && !alreadyFailed && HasFailed()) - Messages::Add("Mission failed.", Messages::Importance::Highest); + Messages::Add("Mission failed" + (caller ? ": \"" + caller->Name() + "\"" : "") + ".", + Messages::Importance::Highest); else if(ui && !alreadySucceeded && HasSucceeded(player.GetSystem(), false)) { // If "completing" this NPC displays a conversation, reference diff --git a/source/PlanetPanel.cpp b/source/PlanetPanel.cpp index 9aa265a3e6bc..f3fdf10f815a 100644 --- a/source/PlanetPanel.cpp +++ b/source/PlanetPanel.cpp @@ -75,6 +75,14 @@ PlanetPanel::PlanetPanel(PlayerInfo &player, function callback) void PlanetPanel::Step() { + // If the player is dead, pop the planet panel. + if(player.IsDead()) + { + player.SetPlanet(nullptr); + GetUI()->PopThrough(this); + return; + } + // If the previous mission callback resulted in a "launch", take off now. const Ship *flagship = player.Flagship(); if(flagship && flagship->CanBeFlagship() && (player.ShouldLaunch() || requestedLaunch)) @@ -102,9 +110,6 @@ void PlanetPanel::Step() void PlanetPanel::Draw() { - if(player.IsDead()) - return; - Information info; info.SetSprite("land", planet.Landscape()); @@ -154,6 +159,9 @@ void PlanetPanel::Draw() // Only override the ones you need; the default action is to return false. bool PlanetPanel::KeyDown(SDL_Keycode key, Uint16 mod, const Command &command, bool isNewPress) { + if(player.IsDead()) + return true; + Panel *oldPanel = selectedPanel; const Ship *flagship = player.Flagship(); diff --git a/source/PlayerInfoPanel.cpp b/source/PlayerInfoPanel.cpp index 7f04357e27f9..46d760b3c2b9 100644 --- a/source/PlayerInfoPanel.cpp +++ b/source/PlayerInfoPanel.cpp @@ -63,7 +63,7 @@ namespace { if(otherCount > 0 && maxCount > 0) { - list[maxCount - 1].second = "(" + to_string(otherCount + 1) + " Others)"; + list[maxCount - 1].second = "(" + to_string(otherCount + 1) + " others)"; while(otherCount--) { list[maxCount - 1].first += list.back().first; @@ -688,13 +688,13 @@ void PlayerInfoPanel::DrawPlayer(const Rectangle &bounds) vector> salary; for(const auto &it : player.Accounts().SalariesIncome()) salary.emplace_back(it.second, it.first); - sort(salary.begin(), salary.end()); + sort(salary.begin(), salary.end(), std::greater<>()); DrawList(salary, table, "salary:", 4); vector> tribute; for(const auto &it : player.GetTribute()) tribute.emplace_back(it.second, it.first->TrueName()); - sort(tribute.begin(), tribute.end()); + sort(tribute.begin(), tribute.end(), std::greater<>()); DrawList(tribute, table, "tribute:", 4); int maxRows = static_cast(250. - 30. - table.GetPoint().Y()) / 20; @@ -835,6 +835,9 @@ void PlayerInfoPanel::DrawFleet(const Rectangle &bounds) // Sorts the player's fleet given a comparator function (based on column). void PlayerInfoPanel::SortShips(InfoPanelState::ShipComparator *shipComparator) { + if(panelState.Ships().empty()) + return; + // Clicking on a sort column twice reverses the comparison. if(panelState.CurrentSort() == shipComparator) shipComparator = GetReverseCompareFrom(*shipComparator); @@ -863,7 +866,12 @@ void PlayerInfoPanel::SortShips(InfoPanelState::ShipComparator *shipComparator) shipComparator ); + // Ships are now sorted. + panelState.SetCurrentSort(shipComparator); + // Load the same selected ships from before the sort. + if(selectedShips.empty()) + return; auto it = selectedShips.begin(); for(size_t i = 0; i < panelState.Ships().size(); ++i) if(panelState.Ships()[i] == *it) @@ -877,9 +885,6 @@ void PlayerInfoPanel::SortShips(InfoPanelState::ShipComparator *shipComparator) if(it == selectedShips.end()) break; } - - // Ships are now sorted. - panelState.SetCurrentSort(shipComparator); } diff --git a/source/Plugins.h b/source/Plugins.h index 07db9cf8027f..6f69d0a25345 100644 --- a/source/Plugins.h +++ b/source/Plugins.h @@ -37,7 +37,7 @@ struct Plugin { std::set required; // The plugins, if any, which are designed to work with this plugin but aren't required. std::set optional; - // The plugins, if any, which can't be run along side this plugin. + // The plugins, if any, which can't be run alongside this plugin. std::set conflicted; }; diff --git a/source/Politics.cpp b/source/Politics.cpp index 921c437f6767..559356d572d5 100644 --- a/source/Politics.cpp +++ b/source/Politics.cpp @@ -258,6 +258,35 @@ string Politics::Fine(PlayerInfo &player, const Government *gov, int scan, const int failedMissions = 0; + // Illegal passengers can only be detected by planetary security. + if(!scan) + { + int64_t fine = ship->Cargo().IllegalPassengersFine(gov, player); + if((fine > maxFine && maxFine >= 0) || fine < 0) + { + maxFine = fine; + reason = " for carrying illegal passengers."; + + for(const Mission &mission : player.Missions()) + { + if(mission.IsFailed(player)) + continue; + + string fineMessage = mission.FineMessage(); + if(!fineMessage.empty()) + { + reason = ".\n\t"; + reason.append(fineMessage); + } + // Fail any missions with illegal passengers and "stealth" set. + if(mission.Fine() > 0 && mission.Passengers() && mission.FailIfDiscovered()) + { + player.FailMission(mission); + ++failedMissions; + } + } + } + } if((!scan || (scan & ShipEvent::SCAN_CARGO)) && !EvadesCargoScan(*ship)) { int64_t fine = ship->Cargo().IllegalCargoFine(gov, player); @@ -271,15 +300,15 @@ string Politics::Fine(PlayerInfo &player, const Government *gov, int scan, const if(mission.IsFailed(player)) continue; - // Append the illegalCargoMessage from each applicable mission, if available - string illegalCargoMessage = mission.IllegalCargoMessage(); - if(!illegalCargoMessage.empty()) + // Append the fineMessage from each applicable mission, if available. + string fineMessage = mission.FineMessage(); + if(!fineMessage.empty()) { reason = ".\n\t"; - reason.append(illegalCargoMessage); + reason.append(fineMessage); } - // Fail any missions with illegal cargo and "Stealth" set - if(mission.IllegalCargoFine() > 0 && mission.FailIfDiscovered()) + // Fail any missions with illegal cargo and "stealth" set. + if(mission.Fine() > 0 && mission.CargoSize() && mission.FailIfDiscovered()) { player.FailMission(mission); ++failedMissions; diff --git a/source/PreferencesPanel.cpp b/source/PreferencesPanel.cpp index a8b360c06b8e..db7bc41e970b 100644 --- a/source/PreferencesPanel.cpp +++ b/source/PreferencesPanel.cpp @@ -455,9 +455,9 @@ bool PreferencesPanel::Scroll(double dx, double dy) { int speed = Preferences::ScrollSpeed(); if(dy < 0.) - speed = max(20, speed - 20); + speed = max(10, speed - 10); else - speed = min(60, speed + 20); + speed = min(60, speed + 10); Preferences::SetScrollSpeed(speed); } return true; @@ -1420,10 +1420,10 @@ void PreferencesPanel::HandleSettingsString(const string &str, Point cursorPosit } else if(str == SCROLL_SPEED) { - // Toggle between three different speeds. - int speed = Preferences::ScrollSpeed() + 20; + // Toggle between six different speeds. + int speed = Preferences::ScrollSpeed() + 10; if(speed > 60) - speed = 20; + speed = 10; Preferences::SetScrollSpeed(speed); } else if(str == DATE_FORMAT) diff --git a/source/Projectile.cpp b/source/Projectile.cpp index 83490c7d3161..130299cdcff3 100644 --- a/source/Projectile.cpp +++ b/source/Projectile.cpp @@ -16,6 +16,7 @@ this program. If not, see . #include "Projectile.h" #include "Effect.h" +#include "FighterHitHelper.h" #include "pi.h" #include "Random.h" #include "Ship.h" @@ -147,7 +148,7 @@ void Projectile::Move(vector &visuals, vector &projectiles) { target = TargetPtr().get(); if(!target || !target->IsTargetable() || target->GetGovernment() != targetGovernment || - (!targetDisabled && target->IsDisabled() && target->CanBeCarried())) + (!targetDisabled && !FighterHitHelper::IsValidTarget(target))) { BreakTarget(); target = nullptr; diff --git a/source/Ship.cpp b/source/Ship.cpp index 590f853898f6..7208c08fd3ba 100644 --- a/source/Ship.cpp +++ b/source/Ship.cpp @@ -1302,7 +1302,7 @@ vector Ship::FlightCheck() const checks.emplace_back("afterburner only?"); if(!thrust && !afterburner) checks.emplace_back("reverse only?"); - if(!generation && !solar && !consuming) + if(energy <= battery) checks.emplace_back("battery only?"); if(energy < thrustEnergy) checks.emplace_back("limited thrust?"); @@ -2085,7 +2085,7 @@ Point Ship::FireTractorBeam(const Flotsam &flotsam, vector &visuals) return pullVector; if(!GetParent() && flotsamSetting == Preferences::FlotsamCollection::ESCORT) return pullVector; - if(flotsamSetting == Preferences::FlotsamCollection::FLAGSHIP) + if(GetParent() && flotsamSetting == Preferences::FlotsamCollection::FLAGSHIP) return pullVector; } @@ -2202,6 +2202,9 @@ bool Ship::CanLand() const if(!GetTargetStellar()->GetPlanet()->CanLand(*this)) return false; + if(commands.Has(Command::WAIT)) + return false; + Point distance = GetTargetStellar()->Position() - position; double speed = velocity.Length(); @@ -3060,8 +3063,14 @@ int Ship::TakeDamage(vector &visuals, const DamageDealt &damage, const G hullDelay = max(hullDelay, static_cast(attributes.Get("disabled repair delay"))); } if(!wasDestroyed && IsDestroyed()) + { type |= ShipEvent::DESTROY; + if(IsYours() && Preferences::Has("Extra fleet status messages")) + Messages::Add("Your " + DisplayModelName() + + " \"" + Name() + "\" has been destroyed.", Messages::Importance::Highest); + } + // Inflicted heat damage may also disable a ship, but does not trigger a "DISABLE" event. if(heat > MaximumHeat()) { @@ -3727,9 +3736,6 @@ int Ship::StepDestroyed(vector &visuals, list> &flot // Once we've created enough little explosions, die. if(explosionCount == explosionTotal || forget) { - if(IsYours() && Preferences::Has("Extra fleet status messages")) - Messages::Add("Your ship \"" + Name() + "\" has been destroyed.", Messages::Importance::Highest); - if(!forget) { const Effect *effect = GameData::Effects().Get("smoke"); diff --git a/source/TaskQueue.cpp b/source/TaskQueue.cpp index 6754a00cd7d4..d89c99fa56ba 100644 --- a/source/TaskQueue.cpp +++ b/source/TaskQueue.cpp @@ -63,7 +63,7 @@ TaskQueue::~TaskQueue() -// Queue a function to execute in parallel, with an another optional function that +// Queue a function to execute in parallel, with another optional function that // will get executed on the main thread after the first function finishes. // Returns a future representing the future result of the async call. Ignores // any main thread task that still need to be executed! @@ -134,7 +134,7 @@ void TaskQueue::ThreadLoop() noexcept // Check whether it is time for this thread to quit. if(shouldQuit) return; - // No more tasks to execute, just to to sleep. + // No more tasks to execute, just go to sleep. if(tasks.empty()) break; diff --git a/source/TaskQueue.h b/source/TaskQueue.h index 1f60b974e820..17362eb5c5c8 100644 --- a/source/TaskQueue.h +++ b/source/TaskQueue.h @@ -57,7 +57,7 @@ class TaskQueue { TaskQueue &operator=(const TaskQueue &) = delete; ~TaskQueue(); - // Queue a function to execute in parallel, with an another optional function that + // Queue a function to execute in parallel, with another optional function that // will get executed on the main thread after the first function finishes. // Returns a future representing the future result of the async call. Ignores // any main thread task that still need to be executed! diff --git a/source/Test.h b/source/Test.h index 9dc04799300f..c766c068ec00 100644 --- a/source/Test.h +++ b/source/Test.h @@ -89,7 +89,7 @@ class Test { // checking asserts (similar to Conversations). ConditionSet conditions; // Labels to jump to in case of branches. We could optimize during - // load to lookup the step numbers (and provide integer stepnumbers + // load to look up the step numbers (and provide integer step numbers // here), but we can also use the textual information during error/ // debug printing, so keeping the strings for now. std::string jumpOnTrueTarget; diff --git a/source/main.cpp b/source/main.cpp index 541f62fbf123..c2b90214b37e 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -644,7 +644,7 @@ void PrintHelp() void PrintVersion() { cerr << endl; - cerr << "Endless Sky ver. 0.10.7" << endl; + cerr << "Endless Sky ver. 0.10.8" << endl; cerr << "License GPLv3+: GNU GPL version 3 or later: " << endl; cerr << "This is free software: you are free to change and redistribute it." << endl; cerr << "There is NO WARRANTY, to the extent permitted by law." << endl; diff --git a/source/text/Format.cpp b/source/text/Format.cpp index ebcf08ee65a2..e3c60730ccd9 100644 --- a/source/text/Format.cpp +++ b/source/text/Format.cpp @@ -136,7 +136,7 @@ namespace { // Helper function for ExpandConditions. // - // source.substr(formatStart, formatSize) contains the format (credits, mass, etc) + // source.substr(formatStart, formatSize) contains the format (credits, mass, etc.) // source.substr(conditionStart, conditionSize) contains the condition name // // If formatStart or formatSize are string::npos, then there is no formatting. @@ -559,12 +559,12 @@ string Format::Capitalize(const string &str) bool first = true; for(char &c : result) { - if(isspace(c)) + if(isspace(static_cast(c))) first = true; else { - if(first && islower(c)) - c = toupper(c); + if(first && islower(static_cast(c))) + c = toupper(static_cast(c)); first = false; } } @@ -577,7 +577,7 @@ string Format::LowerCase(const string &str) { string result = str; for(char &c : result) - c = tolower(c); + c = tolower(static_cast(c)); return result; } @@ -719,6 +719,6 @@ string Format::ExpandConditions(const string &source, const ConditionGetter &get int Format::Search(const string &str, const string &sub) { auto it = search(str.begin(), str.end(), sub.begin(), sub.end(), - [](char a, char b) { return toupper(a) == toupper(b); }); + [](unsigned char a, unsigned char b) { return toupper(a) == toupper(b); }); return (it == str.end() ? -1 : it - str.begin()); } diff --git a/source/text/Utf8.cpp b/source/text/Utf8.cpp index 0e138bc2c919..def3001ea37d 100644 --- a/source/text/Utf8.cpp +++ b/source/text/Utf8.cpp @@ -23,6 +23,12 @@ this program. If not, see . using namespace std; +namespace { + constexpr char32_t BOM = 0x0000FEFF; +} + + + namespace Utf8 { #if defined(_WIN32) wstring ToUTF16(const string &input, bool isPath) @@ -60,6 +66,14 @@ namespace Utf8 { + // Check if this character is the byte order mark (BOM) sequence. + bool IsBOM(char32_t c) + { + return c == BOM; + } + + + size_t NextCodePoint(const string &str, size_t pos) { if(pos >= str.length()) diff --git a/source/text/Utf8.h b/source/text/Utf8.h index 2094d626669c..c639cd77bf99 100644 --- a/source/text/Utf8.h +++ b/source/text/Utf8.h @@ -25,6 +25,9 @@ namespace Utf8 { std::string ToUTF8(const wchar_t *str); #endif + // Check if this character is the byte order mark (BOM) sequence. + bool IsBOM(char32_t c); + // Skip to the next unicode code point after pos in utf8. // Return string::npos when there are no more code points. std::size_t NextCodePoint(const std::string &str, std::size_t pos); diff --git a/steam/docker-compose.yml b/steam/docker-compose.yml index 353ef9915758..f36253a493fc 100644 --- a/steam/docker-compose.yml +++ b/steam/docker-compose.yml @@ -9,7 +9,6 @@ services: - '/bin/bash' - '-c' - | - apt-get -y update && apt-get -y install libmad0-dev mkdir -p build/steam-x64 cd build/steam-x64 cmake ../../ -GNinja -DES_STEAM=ON -DCMAKE_BUILD_TYPE=Release -DVCPKG_TARGET_TRIPLET=linux-x64-release-static @@ -25,7 +24,6 @@ services: - '/bin/bash' - '-c' - | - apt-get -y update && apt-get -y install libmad0-dev mkdir -p build/steam-x86 cd build/steam-x86 cmake ../../ -GNinja -DES_STEAM=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-m32 -DVCPKG_TARGET_TRIPLET=linux-x86-release-static