d1055fa8978798dbcfe1d36a9d50b2ed24ba4ac1

Author
TheEdgeOfRage <git@theedgeofrage.com>
Committer
TheEdgeOfRage <git@theedgeofrage.com>
Date

Message

Allow push-to-talk without explicit conversation initiation

Remove the InConversation gate on F2. The world model determines from
scene context who the player is addressing, so no prior 'talk to X'
action is needed.

Diff

 1diff --git a/internal/game/state.go b/internal/game/state.go
 2index 338bf49e306e7c0bda457d3b754bdc4d9d10ec53..4a5b071f09f452f26b614135e920218d74d71b66 100644
 3--- a/internal/game/state.go
 4+++ b/internal/game/state.go
 5@@ -81,12 +81,6 @@ func (s *State) Talk() string {
 6 	return s.talk
 7 }
 8 
 9-// InConversation reports whether push-to-talk is allowed (a person is present).
10-func (s *State) InConversation() bool {
11-	t := s.Talk()
12-	return t != "" && !strings.EqualFold(t, "none")
13-}
14-
15 // RecordUser appends the player's next user message (typed action or spoken
16 // transcript) to the open segment. Call it before Prompt for that turn so the
17 // model sees the new move; the matching assistant reply is added by ApplyReply.
18diff --git a/internal/ui/app.go b/internal/ui/app.go
19index 068beddee61d0ba47879f46424d96671ab9642ef..0e764f384301ad2095793d97d550ecb943088f98 100644
20--- a/internal/ui/app.go
21+++ b/internal/ui/app.go
22@@ -127,15 +127,10 @@ func (m *model) handleKey(k tea.KeyMsg) tea.Cmd {
23 	return nil
24 }
25 
26-// talkToggle starts or stops push-to-talk. It is only offered while a person is
27-// present (state.InConversation); otherwise the user must type an action.
28+// talkToggle starts or stops push-to-talk.
29 func (m *model) talkToggle() tea.Cmd {
30 	switch m.phase {
31 	case phaseIdle:
32-		if !m.state.InConversation() {
33-			m.status = "no one here to talk to — type an action"
34-			return nil
35-		}
36 		m.phase = phaseRecording
37 		m.beginning = true
38 		m.recSince = time.Now()