Fix stat lookups
This commit is contained in:
		
							parent
							
								
									bf55252b9a
								
							
						
					
					
						commit
						67aebee24d
					
				| @ -8,18 +8,20 @@ Storybook::Storybook(FILE* fin) { | ||||
|   pages = CyoaParse(fin); | ||||
| } | ||||
| 
 | ||||
| void Storybook::UpdateStat(const char *key, int rel) { | ||||
| void Storybook::UpdateStat(const char *ckey, int rel) { | ||||
|   std::string key(ckey); | ||||
|   auto it = stats.find(key); | ||||
|   if (it == stats.end()) { | ||||
|     // Key not present
 | ||||
|     stats[key] = 0; | ||||
|     stats[key] = rel; | ||||
|   } else { | ||||
|     // Key present, add the rel
 | ||||
|     stats[key] = it->second + rel; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| int Storybook::LookupStat(const char *key) { | ||||
| int Storybook::LookupStat(const char *ckey) { | ||||
|   std::string key(ckey); | ||||
|   auto it = stats.find(key); | ||||
|   if (it == stats.end()){ | ||||
|     stats[key] = 0; | ||||
| @ -54,36 +56,48 @@ void Storybook::Advance() { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void Storybook::Advance(int choice_key) { | ||||
| void Storybook::Advance(int choice_option) { | ||||
|   // TODO throw an exception if the ending type is not choices.
 | ||||
|   Choice* choice = (*current->footer.choices)[choice_key]; | ||||
|   if (!choice) { | ||||
|   if (!IsChoiceAvailable(choice_option)) { | ||||
|     // TODO throw exception?
 | ||||
|   } | ||||
|    | ||||
|   if (auto ck = choice->statcheck) { | ||||
|     int val = LookupStat(ck->stat); | ||||
|     if (ck->rel == STATCHECK_GT && val < ck->value || | ||||
| 	ck->rel == STATCHECK_LT && val > ck->value) { | ||||
|       // TODO throw different exception?
 | ||||
|     } | ||||
|   } | ||||
|   Choice* choice = (*current->footer.choices)[choice_option]; | ||||
|    | ||||
|   if (auto cg = choice->statchange) { | ||||
|   if (statchange_t *cg = choice->statchange) | ||||
|     UpdateStat(cg->stat, cg->addend); | ||||
|   } | ||||
| 
 | ||||
|   Find(choice->id); | ||||
| } | ||||
| 
 | ||||
| void print_choice(Choice* c) { | ||||
|   printf("%d) %s", c->option, c->flavor); | ||||
|   if (c->statcheck) { | ||||
|     printf("(%s %d%c)", | ||||
| 	   c->statcheck->stat, | ||||
| 	   c->statcheck->value, | ||||
| 	   c->statcheck->rel == STATCHECK_GT ? '+' : '-'); | ||||
| bool Storybook::IsChoiceAvailable(int choice_option) { | ||||
|   Choice* choice = (*current->footer.choices)[choice_option]; | ||||
|   if (!choice) | ||||
|     return false; | ||||
| 
 | ||||
|   statcheck_t *ck = choice->statcheck; | ||||
|   if (ck) { | ||||
|     int val = LookupStat(ck->stat); | ||||
|     if (ck->rel == STATCHECK_GT && val < ck->value || | ||||
| 	ck->rel == STATCHECK_LT && val > ck->value) | ||||
|       return false; | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| void Storybook::print_choice(Choice* c) { | ||||
|   if (!IsChoiceAvailable(c->option)) | ||||
|     printf("\033[;31m"); // Red background
 | ||||
|    | ||||
|   printf("%d) %s", c->option, c->flavor); | ||||
|   if (c->statchange) { | ||||
|     printf("(%s %+d)", | ||||
| 	   c->statchange->stat, | ||||
| 	   c->statchange->addend); | ||||
|   } | ||||
|   if (!IsChoiceAvailable(c->option)) | ||||
|     printf("\033[;0m"); | ||||
|   printf("\n"); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -10,8 +10,10 @@ | ||||
| class Storybook { | ||||
| private: | ||||
|   std::vector<Page*> pages; | ||||
|   std::unordered_map<const char*, int> stats; | ||||
|   std::unordered_map<std::string, int> stats; | ||||
|   Page *current; | ||||
| 
 | ||||
|   void print_choice(Choice *c); | ||||
| public: | ||||
|   Storybook(FILE* fin); | ||||
|    | ||||
| @ -24,6 +26,7 @@ public: | ||||
|   void Find(const char*); | ||||
|   void Advance(); // For Goto and End cases
 | ||||
|   void Advance(int); // For Choices
 | ||||
|   bool IsChoiceAvailable(int); | ||||
|   bool IsEnded = false; | ||||
| 
 | ||||
|   // This will probably be moved to the cli driver
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user