Feat: ru words; make last clue more prominent
This commit is contained in:
		| @@ -200,7 +200,6 @@ work | ||||
| cooperative | ||||
| practice | ||||
| executive | ||||
| woodruff | ||||
| ultraviolet | ||||
| dream | ||||
| contradiction | ||||
| @@ -448,9 +447,7 @@ feminine | ||||
| blonde | ||||
| goodness | ||||
| intellectual | ||||
| eve | ||||
| client | ||||
| why | ||||
| vent | ||||
| vector | ||||
| lit | ||||
| @@ -461,7 +458,6 @@ gold | ||||
| trail | ||||
| proprietor | ||||
| questionnaire | ||||
| bob | ||||
| pencil | ||||
| consultant | ||||
| envelope | ||||
| @@ -858,7 +854,6 @@ threshold | ||||
| upset | ||||
| bone | ||||
| billion | ||||
| peter | ||||
| narrow | ||||
| interest | ||||
| violation | ||||
| @@ -1087,7 +1082,6 @@ future | ||||
| patch | ||||
| conformity | ||||
| mystery | ||||
| 100 | ||||
| luncheon | ||||
| statesman | ||||
| stability | ||||
| @@ -1549,7 +1543,6 @@ rebel | ||||
| development | ||||
| pro | ||||
| raise | ||||
| 1000 | ||||
| sink | ||||
| value | ||||
| discovery | ||||
| @@ -1906,7 +1899,6 @@ slate | ||||
| accuracy | ||||
| dilemma | ||||
| truck | ||||
| hart | ||||
| capitol | ||||
| husband | ||||
| now | ||||
| @@ -1916,7 +1908,6 @@ matter | ||||
| success | ||||
| streetcar | ||||
| concentrate | ||||
| meantime | ||||
| abuse | ||||
| barrel | ||||
| positive | ||||
| @@ -2077,7 +2068,6 @@ sanction | ||||
| sail | ||||
| squeeze | ||||
| repeat | ||||
| wally | ||||
| store | ||||
| yesterday | ||||
| killer | ||||
| @@ -2826,7 +2816,6 @@ slip | ||||
| battle | ||||
| list | ||||
| ethnic | ||||
| oersted | ||||
| camera | ||||
| regular | ||||
| prospect | ||||
| @@ -2881,7 +2870,6 @@ transition | ||||
| portion | ||||
| counsel | ||||
| complexity | ||||
| rico | ||||
| dough | ||||
| life | ||||
| dose | ||||
|   | ||||
| @@ -15,10 +15,13 @@ | ||||
|   {{end}} | ||||
| </div> | ||||
| <script> | ||||
|   // Scroll to the bottom of the action history container | ||||
|   const container = document.getElementById('actionHistoryContainer'); | ||||
|   if (container) { | ||||
|     container.scrollTop = container.scrollHeight; | ||||
|   if (!window.actionHistoryScrollSet) { | ||||
|     htmx.onLoad(function(target) { | ||||
|       if (target.id === 'actionHistoryContainer') { | ||||
|         target.scrollTop = target.scrollHeight; | ||||
|       } | ||||
|     }); | ||||
|     window.actionHistoryScrollSet = true; | ||||
|   } | ||||
| </script> | ||||
| {{end}} | ||||
|   | ||||
| @@ -26,9 +26,10 @@ | ||||
|   {{if .Room.IsRunning}} | ||||
|     <p>Turn of the <span class="text-{{.Room.TeamTurn}}-500">{{.Room.TeamTurn}}</span> team</p> | ||||
|     {{if .Room.MimeDone}} | ||||
|     <p class="text-{{.Room.TeamTurn}}-500">Waiting for guessers</p> | ||||
|     <p class="text-{{.Room.TeamTurn}}-500 text-xl">Waiting for guessers</p> | ||||
|     <p class="text-{{.Room.TeamTurn}}-500 text-xl">Given Clue: "{{.Room.FetchLastClueWord}}"</p> | ||||
|     {{else}} | ||||
|     <p class="text-{{.Room.TeamTurn}}-500">Waiting for mime</p> | ||||
|     <p class="text-{{.Room.TeamTurn}}-500 text-xl">Waiting for mime</p> | ||||
|     {{end}} | ||||
|     {{template "cardcounter" .Room}} | ||||
|   {{end}} | ||||
|   | ||||
| @@ -23,10 +23,9 @@ var ( | ||||
| 	DoneChanMap   = make(map[string]chan bool) | ||||
| 	// got prompt: control character (\\u0000-\\u001F) found while parsing a string at line 4 column 0 | ||||
| 	MimePrompt          = `we are playing alias;\nyou are a mime (player who gives a clue of one noun word and number of cards you expect them to open) of the %s team (people who would guess by your clue want open the %s cards);\nplease return your clue, number of cards to open and what words you mean them to find using that clue in json like:\n{\n\"clue\": \"one-word-noun\",\n\"number\": \"number-from-0-to-9\",\n\"words_I_mean_my_team_to_open\": [\"this\", \"that\", ...]\n}\nthe team who openes all their cards first wins.\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;\nhere is the game info in json:\n%s` | ||||
| 	// TODO: simplify; bot gets confused; so show it only unrevealed cards and last clue (maybe older clues as well); | ||||
| 	GuesserPrompt       = `we are playing alias;\nyou are to guess words of the %s team (you want open %s cards) by given clue and a number of meant guesses;\nplease return your guesses and words that could be meant by the clue, but you do not wish to open yet, in json like:\n{\n\"guesses\": [\"word1\", \"word2\", ...],\n\"could_be\": [\"this\", \"that\", ...]\n}\nthe team who openes all their cards first wins.\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;\nhere is the cards (and other info), you need to choose revealed==false words:\n%s` | ||||
| 	GuesserSimplePrompt = `we are playing game of alias;\n you were given a clue: \"%s\";\nplease return your guess and words that could be meant by the clue, but you do not wish to open yet, in json like:\n{\n\"guess\": \"most_relevant_word_to_the_clue\",\n\"could_be\": [\"this\", \"that\", ...]\n}\nhere is the words that left:\n%v` | ||||
| 	MimeSimplePrompt    = `we are playing alias;\nyou are to give a clue to your team so they could open these words: %v;\nhere are the words of opposite team you should avoid: %v;\nand here is a black word that is critical not to pick: %s;\nplease return your clue, number of cards to open and what words you mean them to find using that clue in json like:\n{\n\"clue\": \"one-word-noun\",\n\"number\": \"number-from-0-to-9\",\n\"words_I_mean_my_team_to_open\": [\"this\", \"that\", ...]\n}\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;` | ||||
| 	MimeSimplePrompt    = `we are playing alias;\nyou are to give a clue and a number of words you mean your team to open; your team words: %v;\nhere are the words of opposite team you want to avoid: %v;\nand here is a black word that is critical not to pick: %s;\nplease return your clue, number of cards to open and what words you mean them to find using that clue in json like:\n{\n\"clue\": \"one-word-noun\",\n\"number\": \"number-from-0-to-9-as-string\",\n\"words_I_mean_my_team_to_open\": [\"this\", \"that\", ...]\n}\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;` | ||||
| ) | ||||
|  | ||||
| func convertToSliceOfStrings(value any) ([]string, error) { | ||||
| @@ -196,7 +195,12 @@ func (b *Bot) BotMove() { | ||||
| 		mimeResp := MimeResp{} | ||||
| 		b.log.Info("mime resp log", "mimeResp", tempMap) | ||||
| 		mimeResp.Clue = strings.ToLower(tempMap["clue"].(string)) | ||||
| 		mimeResp.Number = tempMap["number"].(string) | ||||
| 		var ok bool | ||||
| 		mimeResp.Number, ok = tempMap["number"].(string) | ||||
| 		if !ok { | ||||
| 			b.log.Debug("failed to convert the clue number", "tesp", tempMap, "bot_name", b.BotName) | ||||
| 			return | ||||
| 		} | ||||
| 		action := models.Action{ | ||||
| 			Actor:      b.BotName, | ||||
| 			ActorColor: b.Team, | ||||
| @@ -404,26 +408,56 @@ func (b *Bot) BuildSimpleGuesserPrompt(room *models.Room) string { | ||||
| 	return fmt.Sprintf(GuesserSimplePrompt, clueAction.Word, words) | ||||
| } | ||||
|  | ||||
| func (b *Bot) BuildSimpleMimePrompt(room *models.Room) string { | ||||
| 	ourwords := []string{} | ||||
| 	theirwords := []string{} | ||||
| 	blackWord := "" | ||||
| 	for _, card := range room.Cards { | ||||
| 		if card.Revealed { // skipped already opened | ||||
| 			continue | ||||
| 		} | ||||
| 		switch card.Color { | ||||
| 		case models.WordColorBlack: | ||||
| 			blackWord = card.Word | ||||
| 		case models.WordColorBlue: | ||||
| 			if b.Team == models.UserTeamBlue { | ||||
| 				ourwords = append(ourwords, card.Word) | ||||
| 				continue | ||||
| 			} | ||||
| 			theirwords = append(theirwords, card.Word) | ||||
| 		case models.WordColorRed: | ||||
| 			if b.Team == models.UserTeamRed { | ||||
| 				ourwords = append(ourwords, card.Word) | ||||
| 				continue | ||||
| 			} | ||||
| 			theirwords = append(theirwords, card.Word) | ||||
| 		} | ||||
| 	} | ||||
| 	return fmt.Sprintf(MimeSimplePrompt, ourwords, theirwords, blackWord, room.BlueCounter, room.RedCounter) | ||||
| } | ||||
|  | ||||
| func (b *Bot) BuildPrompt(room *models.Room) string { | ||||
| 	if b.Role == "" { | ||||
| 		return "" | ||||
| 	} | ||||
| 	toText := make(map[string]any) | ||||
| 	toText["backlog"] = room.ActionHistory | ||||
| 	// mime sees all colors; | ||||
| 	// guesser sees only revealed ones | ||||
| 	if b.Role == models.UserRoleMime { | ||||
| 		toText["cards"] = room.Cards | ||||
| 	} | ||||
| 	data, err := json.Marshal(toText) | ||||
| 	if err != nil { | ||||
| 		b.log.Error("failed to marshal", "error", err) | ||||
| 		return "" | ||||
| 	} | ||||
| 	// toText := make(map[string]any) | ||||
| 	// toText["backlog"] = room.ActionHistory | ||||
| 	// // mime sees all colors; | ||||
| 	// // guesser sees only revealed ones | ||||
| 	// if b.Role == models.UserRoleMime { | ||||
| 	// 	toText["cards"] = room.Cards | ||||
| 	// } | ||||
| 	// data, err := json.Marshal(toText) | ||||
| 	// if err != nil { | ||||
| 	// 	b.log.Error("failed to marshal", "error", err) | ||||
| 	// 	return "" | ||||
| 	// } | ||||
| 	// Escape the JSON string for inclusion in another JSON field | ||||
| 	escapedData := strings.ReplaceAll(string(data), `"`, `\"`) | ||||
| 	// escapedData := strings.ReplaceAll(string(data), `"`, `\"`) | ||||
| 	if b.Role == models.UserRoleMime { | ||||
| 		return fmt.Sprintf(MimePrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 		// return fmt.Sprintf(MimeSimplePrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 		// return fmt.Sprintf(MimePrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 		return b.BuildSimpleMimePrompt(room) | ||||
| 	} | ||||
| 	if b.Role == models.UserRoleGuesser { | ||||
| 		// return fmt.Sprintf(GuesserPrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
|   | ||||
| @@ -135,6 +135,15 @@ func (r *Room) FetchLastClue() (*Action, error) { | ||||
| 	return nil, errors.New("no clue in history") | ||||
| } | ||||
|  | ||||
| func (r *Room) FetchLastClueWord() string { | ||||
| 	for i := len(r.ActionHistory) - 1; i >= 0; i-- { | ||||
| 		if r.ActionHistory[i].Action == string(ActionTypeClue) { | ||||
| 			return r.ActionHistory[i].Word | ||||
| 		} | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (r *Room) GetPlayerByName(name string) (role UserRole, team UserTeam, found bool) { | ||||
| 	if r.RedTeam.Mime == name { | ||||
| 		return "mime", "red", true | ||||
|   | ||||
							
								
								
									
										3305
									
								
								ru_nouns.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3305
									
								
								ru_nouns.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder