Browse Source

feat: 添加一个非常基础的版本,仅包含 tmux 和 tt++

dzp 4 years ago
parent
commit
c1da2e7e2c
12 changed files with 427 additions and 6 deletions
  1. 22 0
      .gitignore
  2. 58 0
      Dockerfile
  3. 20 0
      HOW-TO-PLAY.md
  4. 51 6
      README.md
  5. 7 0
      bin/doc
  6. 38 0
      bin/start
  7. 38 0
      bin/start-ui
  8. 30 0
      docs/DIRECTORY.md
  9. 0 0
      log/.gitkeep
  10. 11 0
      profile.sh
  11. 28 0
      setup
  12. 124 0
      tmux.conf

+ 22 - 0
.gitignore

@@ -0,0 +1,22 @@
+.DS_Store
+
+.bash_history
+.bash_profile
+.viminfo
+.tintin/*
+
+log/*
+!log/.gitkeep
+ids/*
+!ids/DEFAULT
+!ids/EXAMPLE
+
+foo.tin
+bar.tin
+mwe.tin
+bug.tin
+test.tin
+out
+out[1-9]
+
+var/*

+ 58 - 0
Dockerfile

@@ -0,0 +1,58 @@
+# STAGE 1,在临时镜像中编译 tintin
+FROM alpine:latest
+
+# 安装编译器和依赖包
+RUN    apk update \
+    && apk add --no-cache git gcc libc-dev zlib-dev zlib-static pcre-dev make
+
+RUN git clone https://github.com/mudclient/tintin.git --branch beta-develop
+WORKDIR /tintin/src/
+
+# 这里 hack 了一下 gcc,强制静态编译。
+ENV PATH=.:/sbin:/bin:/usr/sbin:/usr/bin
+RUN echo '/usr/bin/gcc --static $*' > gcc && chmod +x gcc
+RUN ./configure && make && strip tt++
+
+# STAGE 2: 生成最终镜像
+FROM alpine:latest
+LABEL name="paotin"
+LABEL maintainer="dzp <danzipao@gmail.com>"
+
+ENV LANG=zh_CN.UTF8     \
+    TERM=xterm-256color \
+    SHELL=/bin/bash     \
+    HOME=/paotin        \
+    PATH=/paotin/bin:/usr/sbin:/usr/bin:/sbin:/bin
+
+WORKDIR /paotin/
+
+RUN    apk update \
+    && apk add --no-cache tmux bash
+
+# 设置时区为上海
+RUN apk add --no-cache tzdata \
+        && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  \
+        && echo "Asia/Shanghai" > /etc/timezone                 \
+        && apk del tzdata
+
+COPY profile.sh         /paotin/.bash_profile
+COPY tmux.conf          /paotin/.tmux.conf
+
+COPY HOW-TO-PLAY.md     /paotin/
+COPY bin                /paotin/bin/
+COPY docs               /paotin/docs/
+COPY etc                /paotin/etc/
+COPY framework          /paotin/framework/
+COPY plugins            /paotin/plugins/
+
+COPY ids/EXAMPLE        /paotin/ids/
+COPY ids/DEFAULT        /paotin/ids/
+
+COPY --from=0 /tintin/src/tt++ /paotin/bin/
+
+RUN mkdir -p /paotin/log/
+RUN echo debug log > /paotin/log/debug.log
+RUN echo quest log > /paotin/log/quest.log
+RUN echo tt log > /paotin/log/tt.log
+
+ENTRYPOINT ["/bin/bash", "/paotin/bin/start-ui"]

+ 20 - 0
HOW-TO-PLAY.md

@@ -0,0 +1,20 @@
+## 如何开始
+
+你现在就可以输入 `tt++` 来启动 TinTin++。
+
+或者你如果已经准备好了启动配置文件的话,也可以直接输入 `start <你的ID>` 来启动。
+如果你还没有准备好启动配置文件,可以参考 `ids/EXAMPLE` 文件写一个。
+
+```
+# cp ids/EXAMPLE ids/myid   # Docker 环境下用: cp ids/EXAMPLE var/ids/myid
+# vi ids/myid               # Docker 环境下用: vi var/ids/myid
+```
+
+## 了解目录结构
+
+建议先了解一下本客户端的目录结构,以及主要文件的作用和位置,搞清楚有哪些需要你
+配合修改的地方。请输入 `doc docs/DIRECTORY.md` 来了解客户端的目录结构。
+
+## 再次查看本说明
+
+任何时候你都可以通过输入 `doc HOW-TO-PLAY.md` 来再次查看本说明。

+ 51 - 6
README.md

@@ -6,20 +6,65 @@
 
 ## 本地运行
 
+### 使用本地 tt++ (需要自行编译 tintin++)
+
+如果你本地已经编译好了 tt++,那么输入以下命令就可以立即开始游戏:
+
+```
+bin/start-ui
+```
+
+### 使用本仓库推荐的 tt++(推荐)
+
+假设你本地已经有完整的 C 语言开发环境,那么用下面的命令就可以自行编译 tt++:
+
+```
+git clone https://github.com/mudclient/tintin.git --branch beta-develop
+(cd tintin/src && ./configure && make && strip tt++)
+cp tintin/src/tt++ bin/
+export PATH=$PATH:$(pwd)/bin
+mkdir -p log
+bin/start-ui
+```
+
+## Docker 方式运行(推荐)
+
+### 已发布的 Docker 镜像
+
+如果你本地已经安装好了 Docker 环境,使用下面命令就可以立即开始游戏:
+
 ```
-TODO
+docker run --rm -it --name tt --hostname tt mudclient/paotin
 ```
 
-## Docker 方式运行
+上面的命令会自动下载 Docker 镜像,创建 Docker 容器,然后启动游戏界面,开始体验。
+
+如果一切正常,你将会看到一个带有蓝色状态栏的 tmux 界面。和一个简单的游戏指引。
 
-### 预编译的 Docker
+如果想要结束体验,可以按 `<ctrl+a> d` 组合键,就会退出游戏,并自动删除刚刚创建的 Docker 容器。
+
+如果你想要长期挂机,则要使用下面的命令:
 
 ```
-TODO
+docker run -d -it --name tt --hostname tt mudclient/paotin daemon
 ```
 
-### 自行编译 Docker
+以后每次上线的时候,只需要用下面的命令就可以连接到 UI:
 
 ```
-TODO
+docker exec -it tt start-ui
+```
+
+同样可以用 `<ctrl+a> d` 组合键退出游戏。但这并不会终止 TinTin++ 进程,下次用上面的命令可以继续游戏。
+
+### 自行构建 Docker 镜像
+
+你也可以在本地构建 Docker 镜像,并通过下面的命令使用自己构建的镜像开始游戏:
+
+```
+# 构建 Docker 镜像
+docker build -t paotin .
+
+# 开始游戏
+docker run --rm -it --name tt --hostname tt paotin
 ```

+ 7 - 0
bin/doc

@@ -0,0 +1,7 @@
+cat $1 \
+| sed '/^```/,/^```/s/^//'            \
+| sed '/^\[32m```$/d'                     \
+| sed 's/^\(##* .*\)$/\1/'     \
+| sed 's/`//' | sed 's/`//'    \
+| sed 's/`//' | sed 's/`//'    \
+| sed 's/$//'

+ 38 - 0
bin/start

@@ -0,0 +1,38 @@
+#!/bin/sh
+
+TT=
+START_FILE=$1
+
+ECHO="echo -e"
+
+if [ "$(uname -s)" = "Darwin" ]; then
+    ECHO=echo
+fi
+
+if [ "x$START_FILE" = "x" ]; then
+    $ECHO "Usage: $0 <ID>"
+    exit
+fi
+
+if [ ! -z $(which tt-beta 2>/dev/null) ]; then
+    TT=tt-beta
+elif [ ! -z $(which tt++ 2>/dev/null) ]; then
+    TT=tt++
+else
+    $ECHO "\x1b[1;31m软件安装错误,没有找到可用的 tintin,请重新安装。\x1b[0m"
+    exit
+fi
+
+if [ -f var/ids/$START_FILE ]; then
+    START_FILE=var/ids/$START_FILE
+elif [ -f ids/$START_FILE ]; then
+    START_FILE=ids/$START_FILE
+else
+    $ECHO "\x1b[1;31m不存在启动配置文件 \x1b[1;33m$START_FILE\x1b[1;31m。\x1b[0m"
+    exit
+fi
+
+$ECHO "\x1b[1;32m启动 tintin...\x1b[0m"
+$ECHO "\x1b[1;32m$TT $START_FILE\x1b[0m"
+
+$TT $START_FILE

+ 38 - 0
bin/start-ui

@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+MODE=$1
+
+if [ "x$MODE" == "xdaemon" ]; then
+    while true; do bash; done
+    exit
+fi
+
+if [ "x$MODE" == "xLOGO" ]; then
+    echo -e 'PaoTin++\n庖丁加加' | head -$(expr $(date '+%s') '/' 10 '%' 2 '+' 1) | tail -1
+    exit
+fi
+
+if [ "x$TMUXCMD" = "x" ]; then
+    export TMUXCMD="tmux -L MUD"
+fi
+
+SESSION=MUD
+
+# 优先连接到已有的会话,继续之前的状态
+$TMUXCMD attach-session -t $SESSION && exit
+
+# 如果尚未创建会话,则创建一个标准会话
+$TMUXCMD new-session -d -s $SESSION
+$TMUXCMD new-window     -t $SESSION
+$TMUXCMD send-keys      -t $SESSION "touch log/debug.log && tail -f log/debug.log"
+$TMUXCMD send-keys      -t $SESSION Enter
+$TMUXCMD rename-window  -t $SESSION 调试日志
+$TMUXCMD select-window  -t $SESSION:0
+$TMUXCMD split-window   -t $SESSION -vbl 5
+$TMUXCMD send-keys      -t $SESSION "touch log/quest.log && tail -f log/quest.log"
+$TMUXCMD send-keys      -t $SESSION Enter
+$TMUXCMD last-pane
+$TMUXCMD send-keys      -t $SESSION "doc HOW-TO-PLAY.md"
+$TMUXCMD send-keys      -t $SESSION Enter
+
+exec $TMUXCMD attach-session -t $SESSION

+ 30 - 0
docs/DIRECTORY.md

@@ -0,0 +1,30 @@
+## 目录结构和文件说明
+
+```
+> tree -L 2
+.
+├── HOW-TO-PLAY.md      -- 简要说明文件
+├── bin
+│   ├── start-ui        -- 启动游戏环境(第一步,如果是 Docker 环境则已执行过了)
+│   ├── start           -- 启动游戏账号(第二步)
+│   ├── doc             -- markdown 文档查看工具。如果显示异常,请用 cat 代替。
+│   └── tt++            -- tintin++ 主程序
+├── docs
+│   └── DIRECTORY.md    -- 本文件
+├── etc                 -- 客户端配置文件目录(跨 ID 共享)
+├── data                -- 客户端数据文件目录(跨 ID 共享)
+├── framework           -- 主框架程序,不建议修改
+├── ids                 -- 启动配置文件存放目录。建议以 ID 命名,不同 ID 不同文件
+│   ├── DEFAULT         -- 所有 ID 的默认配置,可以在启动配置文件里定制
+│   └── EXAMPLE         -- 一个启动配置文件的例子
+├── log                 -- 日志存放目录
+├── plugins             -- 插件存放目录
+│   ├── lib             -- 基础插件
+│   ├── basic           -- 基本插件
+│   └── shortcut.tin    -- 其它插件
+└── var                 -- Docker 环境下用作本地存储用的挂载目录
+    ├── ids             -- 本地启动配置文件
+    ├── etc             -- 本地配置
+    ├── log             -- 本地日志
+    └── plugins         -- 本地插件目录
+```

+ 0 - 0
log/.gitkeep


+ 11 - 0
profile.sh

@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+export LANG=zh_CN.UTF8
+export TERM=xterm-256color
+
+export PATH=$HOME/bin:$PATH
+export PS1='\[\033[01;40;32m\]MUD\[\033[00m\]:\[\033[33m\]\w\[\033[00m\]\$ '
+
+alias ll='ls -l'
+alias vim=vi
+set -o vi

+ 28 - 0
setup

@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+
+TMP=$(which bash)
+if [ "x$TMP" = "x" ]; then
+    echo 本程序运行前需要先安装 bash/tmux/TinTin++。
+    exit
+fi
+
+export SHELL=$TMP
+
+TMP=$(which tmux)
+if [ "x$TMP" = "x" ]; then
+    echo 本程序运行前需要先安装 bash/tmux/TinTin++。
+    exit
+fi
+
+TMP=$(which tt++)
+if [ "x$TMP" = "x" ]; then
+    echo 本程序运行前需要先安装 bash/tmux/TinTin++。
+    exit
+fi
+
+export HOME=$(pwd)
+export PATH=$HOME/bin:$PATH
+export TMUXCMD="tmux -L MUD -f $HOME/tmux.conf"
+
+test -f .bash_profile || ln -s profile.sh .bash_profile
+exec bash -l

+ 124 - 0
tmux.conf

@@ -0,0 +1,124 @@
+# vim: set fdm=marker foldenable:
+
+########## 基本设置 ---{{{
+#
+# 把 prefix 设置成与 screen 相同,实际上也更好摁一些
+set -g prefix C-a
+unbind-key C-b
+bind-key a send-prefix
+
+set -g buffer-limit 20000;
+
+# 快捷键采用 vi 模式
+setw -g mode-keys vi
+
+# 设置默认 Shell 为 bash
+set -g default-shell /bin/bash
+# }}}
+
+########## 终端属性设置 ---{{{
+# 全面开启鼠标支持,鼠标可以用来选择窗口及面板,调整面板尺寸,以及复制文本
+set -g mouse on
+
+# Use xterm function key sequence
+setw -g xterm-keys on
+
+# 默认终端
+set -g default-terminal "xterm-256color"
+# Terminal overrides
+set -g set-clipboard on
+set -g terminal-overrides "*88col*:colors=88,*256col*:colors=256,xterm*:colors=256,*256col*:Tc,*:Ms"
+
+# 这个不能关,关了进了 vim 再退出屏幕画面不会恢复到进入之前
+setw -g alternate-screen on
+# }}}
+
+########## 状态栏设置 ---{{{
+#
+# 开启状态栏,并在接下来定制状态栏样式
+set -g status on
+# 不关心其它窗口的事件,对强迫症来说太烦人了
+setw -g monitor-activity off
+# 每隔 10 秒刷新一次状态栏
+set -g status-interval 10
+# 状态栏的窗口列表靠左显示
+set -g status-justify left
+# 状态栏的整体色调背景色为蓝色
+set -g status-bg blue
+# 状态栏左部最大长度不超过 32
+set -g status-left-length 32
+# 状态栏左部的格式: 红色的主机名(#h),然后是亮品红的日期时间
+set -g status-left "#[fg=magenta,bold]%m-%d %H:%M #[fg=brightyellow,bold]#{session_name} #[fg=red,bold]| "
+# 状态栏右部最大长度不超过 32
+set -g status-right-length 32
+# 状态栏右部显示内容
+set -g status-right "#[fg=brightyellow]| #(~/bin/start-ui LOGO)#[default]"
+# 状态栏窗口列表中,每个窗口的显示格式: 绿色的编号(#I)及窗口名称(#W)
+setw -g window-status-format '#[fg=green]#I-#W#[default]'
+# 状态栏窗口列表中,当前窗口的显示格式: 黄色的编号(#I)及窗口名称(#W)
+setw -g window-status-current-format '#[fg=brightyellow]#I-#W#[default]'
+# 状态栏窗口列表中,有事件的窗口的显示风格
+setw -g window-status-activity-style fg=red,bold,bg=default
+# 状态栏窗口列表中,有喇叭的窗口的显示风格
+setw -g window-status-bell-style fg=red,bold,bg=default
+# tmux 的信息也会显示在状态栏,包括 tmux 的命令行
+set -g message-style fg=brightyellow,bold,bg=red
+# 设置信息显示时间
+set -g display-time 1000
+# }}}
+
+########## 窗口管理 ---{{{
+set -g detach-on-destroy off
+### }}}
+
+########## 窗口管理 ---{{{
+#
+# 窗口的索引值从 0 开始
+set -g base-index 0
+# 关闭中间的会自动重新编号
+# set -g renumber-windows on
+
+# 类似于 screen,用 Ctrl+C 创建窗口,故意映射两组,防止按错
+bind-key C-c new-window -c '#{pane_current_path}'
+bind-key c new-window -c '#{pane_current_path}'
+
+# 自动设置窗口标题,一旦主动设置过窗口标题,则此窗口不会再次自动设置名称
+setw -g automatic-rename on
+
+# 通过 Ctrl+n / Ctrl+p 来切换窗口
+bind-key C-n next-window
+bind-key n next-window
+bind-key C-p previous-window
+bind-key p previous-window
+
+# 快速在两个窗口之间切换
+bind-key C-a last-window
+
+# 显示所有窗口,以供跳转
+unbind-key l
+bind-key l choose-window
+# }}}
+
+########## 面板管理 ---{{{
+#
+# 显示面板编号,方便跳转,以及通过样式得知哪个是当前面板
+bind-key m display-pane
+bind-key C-m display-pane
+
+set -g display-panes-time 3000
+set -g display-panes-active-colour brightblack
+set -g display-panes-colour brightyellow
+
+# 通过 v 和 h 来切分窗口,或者更直观一些用 - 和 |
+unbind %
+unbind '"'
+bind | split-window -h -c '#{pane_current_path}'
+bind h split-window -h -c '#{pane_current_path}'
+bind - split-window -v -c '#{pane_current_path}'
+bind v split-window -v -c '#{pane_current_path}'
+
+bind-key o last-pane
+bind-key C-o last-pane
+bind-key w select-pane -t :.+
+bind-key Tab select-pane -t :.+
+# }}}