Skip to content

Commit

Permalink
Stateless NPC scripts (#64)
Browse files Browse the repository at this point in the history
* npc chat state is handled by server instead of script, scripts are not written in a stateless way
* change github action to latest go version only
  • Loading branch information
Hucaru committed Sep 11, 2023
1 parent 3d33eb6 commit f534b81
Show file tree
Hide file tree
Showing 14 changed files with 288 additions and 499 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
build:
strategy:
matrix:
go-version: [1.14.x, 1.15.x]
go-version: [1.21.x]
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
Expand Down
44 changes: 22 additions & 22 deletions channel/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -1774,13 +1774,13 @@ func (server *Server) npcChatStart(conn mnet.Client, reader mpacket.Reader) {
}

// Start npc session
var controller *npcScriptController
var controller *npcChatController

if program, ok := server.npcScriptStore.scripts[strconv.Itoa(int(npcData.id))]; ok {
controller, err = createNewnpcScriptController(npcData.id, conn, program, server.warpPlayer, server.fields)
controller, err = createNpcChatController(npcData.id, conn, program, plr, server.fields, server.warpPlayer)
} else {
if program, ok := server.npcScriptStore.scripts["default"]; ok {
controller, err = createNewnpcScriptController(npcData.id, conn, program, server.warpPlayer, server.fields)
controller, err = createNpcChatController(npcData.id, conn, program, plr, server.fields, server.warpPlayer)
}
}

Expand All @@ -1794,7 +1794,8 @@ func (server *Server) npcChatStart(conn mnet.Client, reader mpacket.Reader) {
}

server.npcChat[conn] = controller
if controller.run(plr) {

if controller.run() {
delete(server.npcChat, conn)
}
}
Expand All @@ -1805,7 +1806,7 @@ func (server *Server) npcChatContinue(conn mnet.Client, reader mpacket.Reader) {
}

controller := server.npcChat[conn]
controller.state.ClearFlags()
controller.clearUserInput()

terminate := false

Expand All @@ -1817,9 +1818,9 @@ func (server *Server) npcChatContinue(conn mnet.Client, reader mpacket.Reader) {

switch value {
case 0: // back
controller.state.SetNextBack(false, true)
controller.stateTracker.popState()
case 1: // next
controller.state.SetNextBack(true, false)
controller.stateTracker.addState(npcNextState)
case 255: // 255/0xff end chat
terminate = true
default:
Expand All @@ -1831,52 +1832,51 @@ func (server *Server) npcChatContinue(conn mnet.Client, reader mpacket.Reader) {

switch value {
case 0: // no
controller.state.SetYesNo(false, true)
controller.stateTracker.addState(npcNoState)
case 1: // yes, ok
controller.state.SetYesNo(true, false)
controller.stateTracker.addState(npcYesState)
case 255: // 255/0xff end chat
terminate = true
default:
log.Println("unknown yes/no:", value)
}
case 2: // string input
if reader.ReadBool() {
controller.state.SetTextInput(reader.ReadString(reader.ReadInt16()))
controller.stateTracker.addState(npcStringInputState)
controller.lastInputString = reader.ReadString(reader.ReadInt16())
} else {
terminate = true
}
case 3: // number input
if reader.ReadBool() {
controller.state.SetNumberInput(reader.ReadInt32())
controller.stateTracker.addState(npcNumberInputState)
controller.lastInputNumber = reader.ReadInt32()
} else {
terminate = true
}
case 4: // select option
if reader.ReadBool() {
controller.state.SetOptionSelect(reader.ReadInt32())
controller.stateTracker.addState(npcSelectionState)
controller.lastSelection = reader.ReadInt32()
} else {
terminate = true
}
case 5: // style window (no way to discern between cancel button and end chat selection)
if reader.ReadBool() {
controller.state.SetOptionSelect(int32(reader.ReadByte()))
controller.stateTracker.addState(npcSelectionState)
controller.lastSelection = int32(reader.ReadByte())
} else {
terminate = true
}
case 6:
fmt.Println("pet window:", reader)
fmt.Println("npc pet window:", reader)
default:
log.Println("Unkown npc chat continue packet:", reader)
}

plr, err := server.players.getFromConn(conn)

if err != nil {
if terminate {
delete(server.npcChat, conn)
return
}

if terminate || controller.run(plr) {
} else if controller.run() {
delete(server.npcChat, conn)
}
}
Expand Down Expand Up @@ -1906,7 +1906,7 @@ func (server *Server) npcShop(conn mnet.Client, reader mpacket.Reader) {
}

if controller, ok := server.npcChat[conn]; ok {
goods := controller.state.Goods()
goods := controller.goods

if int(index) < len(goods) && index > -1 {
if len(goods[index]) == 1 { // Default price
Expand Down

0 comments on commit f534b81

Please sign in to comment.