Add !hint_location command.
As it turns out, because factorio location names are 100% identical to factorio item names, it is impossible without a command that explicitly hints locations to hint a specific factorio location, or any other game where location names match item names.
This commit is contained in:
		
							parent
							
								
									f8deb1bd7f
								
							
						
					
					
						commit
						ca4b0acd92
					
				|  | @ -977,14 +977,9 @@ class ClientMessageProcessor(CommonCommandProcessor): | ||||||
|             self.output("Cheating is disabled.") |             self.output("Cheating is disabled.") | ||||||
|             return False |             return False | ||||||
| 
 | 
 | ||||||
|     @mark_raw |     def get_hints(self, input_text: str, explicit_location: bool = False) -> bool: | ||||||
|     def _cmd_hint(self, item_or_location: str = "") -> bool: |  | ||||||
|         """Use !hint {item_name/location_name}, |  | ||||||
|         for example !hint Lamp or !hint Link's House to get a spoiler peek for that location or item. |  | ||||||
|         If hint costs are on, this will only give you one new result, |  | ||||||
|         you can rerun the command to get more in that case.""" |  | ||||||
|         points_available = get_client_points(self.ctx, self.client) |         points_available = get_client_points(self.ctx, self.client) | ||||||
|         if not item_or_location: |         if not input_text: | ||||||
|             hints = {hint.re_check(self.ctx, self.client.team) for hint in |             hints = {hint.re_check(self.ctx, self.client.team) for hint in | ||||||
|                      self.ctx.hints[self.client.team, self.client.slot]} |                      self.ctx.hints[self.client.team, self.client.slot]} | ||||||
|             self.ctx.hints[self.client.team, self.client.slot] = hints |             self.ctx.hints[self.client.team, self.client.slot] = hints | ||||||
|  | @ -994,16 +989,16 @@ class ClientMessageProcessor(CommonCommandProcessor): | ||||||
|             return True |             return True | ||||||
|         else: |         else: | ||||||
|             world = proxy_worlds[self.ctx.games[self.client.slot]] |             world = proxy_worlds[self.ctx.games[self.client.slot]] | ||||||
|             item_name, usable, response = get_intended_text(item_or_location, world.all_names) |             item_name, usable, response = get_intended_text(input_text, world.all_names if not explicit_location else world.location_names) | ||||||
|             if usable: |             if usable: | ||||||
|                 if item_name in world.hint_blacklist: |                 if item_name in world.hint_blacklist: | ||||||
|                     self.output(f"Sorry, \"{item_name}\" is marked as non-hintable.") |                     self.output(f"Sorry, \"{item_name}\" is marked as non-hintable.") | ||||||
|                     hints = [] |                     hints = [] | ||||||
|                 elif item_name in world.item_name_groups: |                 elif item_name in world.item_name_groups and not explicit_location: | ||||||
|                     hints = [] |                     hints = [] | ||||||
|                     for item in world.item_name_groups[item_name]: |                     for item in world.item_name_groups[item_name]: | ||||||
|                         hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item)) |                         hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item)) | ||||||
|                 elif item_name in world.item_names:  # item name |                 elif item_name in world.item_names and not explicit_location:  # item name | ||||||
|                     hints = collect_hints(self.ctx, self.client.team, self.client.slot, item_name) |                     hints = collect_hints(self.ctx, self.client.team, self.client.slot, item_name) | ||||||
|                 else:  # location name |                 else:  # location name | ||||||
|                     hints = collect_hints_location(self.ctx, self.client.team, self.client.slot, item_name) |                     hints = collect_hints_location(self.ctx, self.client.team, self.client.slot, item_name) | ||||||
|  | @ -1036,19 +1031,25 @@ class ClientMessageProcessor(CommonCommandProcessor): | ||||||
|                             hints.append(hint) |                             hints.append(hint) | ||||||
|                             can_pay -= 1 |                             can_pay -= 1 | ||||||
|                             self.ctx.hints_used[self.client.team, self.client.slot] += 1 |                             self.ctx.hints_used[self.client.team, self.client.slot] += 1 | ||||||
|  |                             points_available = get_client_points(self.ctx, self.client) | ||||||
| 
 | 
 | ||||||
|                             if not hint.found: |                             if not hint.found: | ||||||
|                                 self.ctx.hints[self.client.team, hint.finding_player].add(hint) |                                 self.ctx.hints[self.client.team, hint.finding_player].add(hint) | ||||||
|                                 self.ctx.hints[self.client.team, hint.receiving_player].add(hint) |                                 self.ctx.hints[self.client.team, hint.receiving_player].add(hint) | ||||||
| 
 | 
 | ||||||
|                         if not_found_hints: |                         if not_found_hints: | ||||||
|                             if hints: |                             if hints and cost and int((points_available // cost) == 0): | ||||||
|  |                                 self.output( | ||||||
|  |                                     f"There may be more hintables, however, you cannot afford to pay for any more. " | ||||||
|  |                                     f" You have {points_available} and need at least " | ||||||
|  |                                     f"{self.ctx.get_hint_cost(self.client.slot)}.") | ||||||
|  |                             elif hints: | ||||||
|                                 self.output( |                                 self.output( | ||||||
|                                     "There may be more hintables, you can rerun the command to find more.") |                                     "There may be more hintables, you can rerun the command to find more.") | ||||||
|                             else: |                             else: | ||||||
|                                 self.output(f"You can't afford the hint. " |                                 self.output(f"You can't afford the hint. " | ||||||
|                                             f"You have {points_available} points and need at least " |                                             f"You have {points_available} points and need at least " | ||||||
|                                             f"{self.ctx.get_hint_cost(self.client.slot)}") |                                             f"{self.ctx.get_hint_cost(self.client.slot)}.") | ||||||
|                         notify_hints(self.ctx, self.client.team, hints) |                         notify_hints(self.ctx, self.client.team, hints) | ||||||
|                         self.ctx.save() |                         self.ctx.save() | ||||||
|                         return True |                         return True | ||||||
|  | @ -1060,6 +1061,22 @@ class ClientMessageProcessor(CommonCommandProcessor): | ||||||
|                 self.output(response) |                 self.output(response) | ||||||
|                 return False |                 return False | ||||||
| 
 | 
 | ||||||
|  |     @mark_raw | ||||||
|  |     def _cmd_hint(self, item_or_location: str = "") -> bool: | ||||||
|  |         """Use !hint {item_name/location_name}, | ||||||
|  |         for example !hint Lamp or !hint Link's House to get a spoiler peek for that location or item. | ||||||
|  |         If hint costs are on, this will only give you one new result, | ||||||
|  |         you can rerun the command to get more in that case.""" | ||||||
|  |         return self.get_hints(item_or_location) | ||||||
|  | 
 | ||||||
|  |     @mark_raw | ||||||
|  |     def _cmd_hint_location(self, location: str = "") -> bool: | ||||||
|  |         """Use !hint_location {location_name}, | ||||||
|  |         for example !hint atomic-bomb to get a spoiler peek for that location. | ||||||
|  |         (In the case of factorio, or any other game where item names and location names are identical, | ||||||
|  |         this command must be used explicitly.)""" | ||||||
|  |         return self.get_hints(location, True) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def get_checked_checks(ctx: Context, client: Client) -> typing.List[int]: | def get_checked_checks(ctx: Context, client: Client) -> typing.List[int]: | ||||||
|     return [location_id for |     return [location_id for | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue