Improve AI garrisons, player recovery and mission administration

This commit is contained in:
2026-09-24 22:12:45 +02:00
parent 1b1a8b5173
commit 2551d171b3
115 changed files with 3622 additions and 547 deletions
+8 -8
View File
@@ -16,8 +16,8 @@ run(r'''
using string=std::string;
template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;int Count(){return this->size();}void Insert(T x){this->push_back(x);}};
'''+valid+integer+r'''
struct Settings{int chance=15,writes=0;bool fail=false;
int Get(string key){assert(key=="stingerChanceOneIn");return chance;}
struct Settings{int chance=7,writes=0;bool fail=false;
int Get(string key){assert(key=="antiAirChancePercent");return chance;}
bool Set(string key,int value){writes++;if(fail||!Valid(key,value))return false;chance=value;return true;}};
struct ERR_GameMode{struct Settings settings;struct Settings* Settings(){return &settings;}};
struct Provider{
@@ -27,20 +27,20 @@ void Effect(const Array<string>& r){assert(r.back().find("have not rolled yet")!
int main(){
ERR_GameMode mode;Provider p;Array<string> replies;
Array<string> show{"hq","stinger","show"};p.StingerSetting(&mode,show,replies);
assert(mode.settings.writes==0&&replies.back().find("stingerChanceOneIn=15")!=string::npos);Effect(replies);
assert(mode.settings.writes==0&&replies.back().find("antiAirChancePercent=7")!=string::npos);Effect(replies);
Array<string> help{"hq","stinger","help"};p.StingerSetting(&mode,help,replies);
assert(mode.settings.writes==0&&replies.back().find("0 off, 1 every eligible soldier, 2..10000 one in N")!=string::npos);Effect(replies);
assert(mode.settings.writes==0&&replies.back().find("0..100 percent")!=string::npos);Effect(replies);
Array<string> setting{"hq","stinger","set","0"};
for(int n:{0,1,2,15,10000}){
for(int n:{0,1,2,15,100}){
setting[3]=std::to_string(n);p.StingerSetting(&mode,setting,replies);
assert(mode.settings.chance==n&&replies.back().find(" saved.")!=string::npos);Effect(replies);
}
for(string invalid:{"-1","1.0","1junk","10000000","10001","1e1","+1"}){
for(string invalid:{"-1","1.0","1junk","10000000","101","1e1","+1"}){
setting[3]=invalid;p.StingerSetting(&mode,setting,replies);
assert(mode.settings.chance==10000&&replies.back().find("previous setting retained")!=string::npos&&replies.back().find(" saved.")==string::npos);Effect(replies);
assert(mode.settings.chance==100&&replies.back().find("previous setting retained")!=string::npos&&replies.back().find(" saved.")==string::npos);Effect(replies);
}
setting[3]="0";mode.settings.fail=true;p.StingerSetting(&mode,setting,replies);
assert(mode.settings.chance==10000&&replies.back().find("previous setting retained")!=string::npos);Effect(replies);
assert(mode.settings.chance==100&&replies.back().find("previous setting retained")!=string::npos);Effect(replies);
int writes=mode.settings.writes;
for(Array<string> malformed: {Array<string>{"hq","stinger"},Array<string>{"hq","stinger","set"},Array<string>{"hq","stinger","show","extra"}}){
p.StingerSetting(&mode,malformed,replies);assert(mode.settings.writes==writes&&replies.back().find("previous setting retained")!=string::npos);