Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////////////////
- // Copyright (c) 2015 ikasam //
- // Released under the MIT license //
- // http://opensource.org/licenses/mit-license.php //
- ////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //初期設定
- //LogBaseAddr Offset
- //ver 3.0? ID:r4f9Sd32氏感謝
- //CONST LBAbaseOS = $FF07F0
- //CONST LBAsytmOS = $1C0
- //CONST LBAchatOS = $6264
- //ver 3.0.5a
- //CONST LBAbaseOS = $101B880
- //CONST LBAsytmOS = $1C0
- //CONST LBAchatOS = $625C
- //ver 3.0.6a
- //CONST LBAbaseOS = $101C880
- //CONST LBAsytmOS = $1C0
- //CONST LBAchatOS = $625C
- //ver 3.0.7a
- //DQXBaseAddr + PointerOffset → 各BaseAddr
- //CONST logPO = $101E880 //$101E554 + $32C
- //CONST staPO = $101EAC8 //$101E554 + $574
- //ver 3.1.0a
- //DQXBaseAddr + PointerOffset → 各BaseAddr
- //CONST logPO = $FEC1C0 //$101E554 + $32C
- //CONST staPO = $FEC408 //$101E554 + $574
- //ver 3.1.1a
- //DQXBaseAddr + PointerOffset → 各BaseAddr
- //CONST logPO = $FED220 //
- //CONST staPO = $FED468 //
- //各BaseAddr + DataOffset → 各dataAddr
- //CONST logDOsytm = $1C0
- //CONST logDOchat = $625C
- //ver 3.1.5b
- //DQXBaseAddr + PointerOffset → 各BaseAddr
- CONST logPO = $100D230
- CONST staPO = $100D0F0
- //各BaseAddr + DataOffset → 各dataAddr
- CONST logDOsytm = $1C0 + $8
- CONST logDOchat = $625C + $8
- //デフォルト表示(起動後切替可)
- CONST def_slog = true //システムログ
- CONST def_chat = false //チャットログ
- CONST def_sell = false //討伐売り纏め
- CONST def_batt = true //戦闘時状態表示
- //メモリチェックインターバル(ミリ秒)
- CONST mciv = 500
- //ファイル書込インターバル(ミリ秒)
- CONST fwiv = 1200
- //ログは起動時の日付で処理
- CONST CLOG = true //Chatログ出力 cur_dir\YYYYMMDD_dqxlog4u_chat.log
- CONST SLOG = true //systemlogログファイル出力 cur_dir\YYYYMMDD_dqxlog4u_slog.log
- CONST FDBG = true //Debug出力 cur_dir\YYYYMMDD_dqxlog4u_debug.log
- //エラー出力 cur_dir\dqxlog4u_error.log
- //ログ表示最大行数
- CONST info_slog_max = 12
- CONST info_chat_max = 12
- CONST info_sell_max = 50
- CONST info_batt_max = 50
- //バフ効果時間(ログ取得的に5秒位時差有り)
- CONST maxtime_sklt = 120 - 5
- CONST maxtime_fbha = 120 - 5
- CONST maxtime_tnsn = 30 - 5
- //バフ表示 プログレスバー用
- CONST progres_num = 20 //文字数
- CONST progres_ful = "█" //残り表示
- CONST progres_emp = "▒" // 空表示
- //バフ表示 残り時間警告
- CONST time_warn_rest = 15 //警告残り秒数
- CONST time_warn_char = "*" //警告文字
- //CONST DBG = true
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //既知の不具合とかTODO的なもの
- //
- //・systemLog
- //たまにゴミを読み込む ログ通番で避けてはいるけど運が悪いと変なの読むかも
- //
- //・ChatLog
- //ルーム振り分け無し
- //
- //・討伐売り
- //重い&あんまり凝ってないので参考程度に
- //
- //・戦闘データ表示
- //多分バグまみれ
- //ためる参の検知
- //
- //・その他
- //背景と同化する時に見づらい
- //
- //覚書は多くなってきたので最後へ
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //各種定数
- //CreateToolhelp32Snapshot
- CONST TH32CS_SNAPALL = $F
- CONST TH32CS_SNAPHEAPLIST = $1
- CONST TH32CS_INHERIT = $80000001
- CONST TH32CS_SNAPPROCESS = $2
- CONST TH32CS_SNAPTHREAD = $4
- CONST TH32CS_SNAPMODULE = $8
- //OpenProcess
- CONST PROCESS_VM_OPERATION = $8
- CONST PROCESS_VM_READ = $10
- CONST PROCESS_VM_WRITE = $20
- //配列サイズ用
- CONST ArryDwordSize = 4
- CONST ArryWordSize = 2
- CONST ArrySlogSize = $609B
- CONST ArryChatSize = (180 * 180) + (4 * 180)
- //職業変換テーブル
- // public Dim Job_name[] = "dummy","勇者?","戦士","僧侶","魔法使い","武闘家","盗賊","旅芸人","バトルマスター","パラディン","魔法戦士","レンジャー","賢者","スーパースター","まもの使い","どうぐ使い","踊り子"
- public Dim Job_name[] = " ","勇?","戦士","僧侶","魔法","武闘","盗賊","旅芸","バト","パラ","魔戦","レン","賢者","スパ","まも","どう","踊り"
- // public Dim Job_name[] = " ","?","戦","僧","魔","武","盗","旅","バ","パ","電","レ","賢","ス","ま","ど","踊"
- public HASHTBL castTimeMax
- castTimeMax["超はやぶさ斬り"] = 45
- castTimeMax["ギガブレイク"] = 60
- castTimeMax["ビッグバン"] = 60
- castTimeMax["全身全霊斬り"] = 65
- castTimeMax["鉄甲斬"] = 60
- castTimeMax["真・オノむそう"] = 60
- castTimeMax["さみだれ突き"] = 45
- castTimeMax["ジゴスパーク"] = 60
- castTimeMax["ラピッドステッキ"] = 90
- castTimeMax["ティンクルバトン"] = 90
- castTimeMax["水流のかまえ"] = 90
- castTimeMax["奥義・棍閃殺"] = 70
- castTimeMax["超暴走魔法陣"] = 60
- castTimeMax["復活の杖"] = 60
- castTimeMax["カオスエッジ"] = 60
- castTimeMax["ナイトメアファング"] = 60
- castTimeMax["疾風迅雷"] = 45
- castTimeMax["極竜打ち"] = 50
- castTimeMax["サイクロンアッパー"] = 45
- castTimeMax["ライガークラッシュ"] = 65
- castTimeMax["ピンクタイフーン"] = 60
- castTimeMax["百花繚乱"] = 60
- castTimeMax["スタンショット"] =120
- castTimeMax["プレートインパクト"] = 75
- castTimeMax["シャイニングボウ"] = 60
- castTimeMax["弓聖の守り星"] = 30
- castTimeMax["ダークネスショット"] = 60
- castTimeMax["フローズンバード"] = 60
- castTimeMax["デュアルブレイカー"] = 75
- castTimeMax["ファランクス"] = 60
- castTimeMax["スペルガード"] = 30
- castTimeMax["達人の呼吸"] = 90
- castTimeMax["岩石おとし"] = 45
- castTimeMax["せいけん爆撃"] = 45
- castTimeMax["よみがえり節"] = 45
- castTimeMax["魔力のバラード"] = 90
- castTimeMax["回復のララバイ"] = 90
- castTimeMax["チャージタックル"] = 75
- castTimeMax["真・やいばくだき"] = 60
- castTimeMax["ホーリーライト"] = 45
- castTimeMax["女神の祝福"] = 90
- castTimeMax["マヒャデドス"] = 60
- castTimeMax["メラガイアー"] = 65
- castTimeMax["無念無想"] =180
- castTimeMax["ためる参"] = 60
- castTimeMax["ギガボンバー"] = 45
- castTimeMax["サプライズラッシュ"] = 70
- castTimeMax["エンドオブシーン"] = 15
- castTimeMax["ゴッドジャグリング"] = 75
- castTimeMax["たたかいのビート"] =130
- castTimeMax["テンションバーン"] = 75
- castTimeMax["ミラクルブースト"] = 90
- castTimeMax["グランドネビュラ"] = 45
- castTimeMax["聖騎士の堅陣"] = 60
- castTimeMax["フォースブレイク"] = 90
- castTimeMax["マダンテ"] =120
- castTimeMax["あんこくのきり"] = 90
- castTimeMax["ジバルンバ"] = 45
- castTimeMax["フェンリルアタック"] = 60
- castTimeMax["イオグランデ"] = 50
- castTimeMax["むげんのさとり"] =150
- castTimeMax["ドルマドン"] = 60
- castTimeMax["バギムーチョ"] = 45
- castTimeMax["ミリオンスマイル"] = 30
- castTimeMax["スキルクラッシュ"] = 60
- castTimeMax["ウォークライ"] =120
- castTimeMax["メディカルデバイス"] = 60
- castTimeMax["プラズマリムーバー"] = 15
- castTimeMax["ドラゴンステップ"] = 40
- castTimeMax["ビーナスステップ"] = 40
- castTimeMax["ロイヤルステップ"] = 40
- castTimeMax["つるぎの舞"] = 45
- castTimeMax["戦鬼の乱れ舞"] = 45
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //各種変数
- //メモリ取得
- public DqxWid
- public DqxPid
- public DqxPhnd
- public DqxBaseAddr
- public logBA
- public logBAsytm
- public logBAchat
- public logSystmSta
- public logSystmEnd
- public slogIdLast //読み込みエラー対策
- public staBA
- //戦闘データ処理用
- public batt_sta_id
- public batt_end_id
- //処理軽減用 最終通番
- public info_slog_last
- public info_chat_last
- public info_sell_last
- public info_batt_last
- //処理軽減用 保持数
- public info_slog_keep
- public info_chat_keep
- //表示用
- public info_sysm_str //スクリプトの状態表示
- public info_slog_str //システムログ
- public info_chat_str //チャット
- public info_sell_str //討伐売り
- public info_batt_str //戦闘データ
- //表示位置用
- public tgl_log_full
- public tgl_log_dqxx
- public tgl_log_dqxy
- public tgl_log_dqxw
- public tgl_log_dqxh
- public tgl_log_clix
- public tgl_log_cliy
- public tgl_log_cliw
- public tgl_log_clih
- //表示位置調整用
- public info_sysm_x
- public info_sysm_y
- public info_sysm_h
- public info_slog_h
- public info_chat_h
- public info_sell_h
- public info_batt_h
- public info_batt_w
- //スレッド排他制御用
- public info_sysm_trd
- public info_slog_trd
- public info_chat_trd
- public info_sell_trd
- public info_batt_trd
- //削除予定
- public infohead
- public infostr
- public infowinx
- public infowiny
- public infofixedx
- public infofixedy
- public infofixed_flg
- //ログ出力先
- PUBLIC clogpath
- PUBLIC slogpath
- PUBLIC dbgpath
- PUBLIC errpath
- //戦闘状態検知用
- public fight_flg
- public fight_sta
- public fight_time //DPS測定用総戦闘時間
- public fight_tmpname //2行以上のログの派生元
- public HASHTBL fight_char = HASH_SORT //戦闘中のキャラ key:名前 data:総食らいダメージ
- public HASHTBL fight_mons = HASH_SORT //戦闘中のモンスター key:名前 data:総食らいダメージ
- public HASHTBL fight_charAtk = HASH_SORT //戦闘中のキャラ key:名前 data:総攻撃ダメージ
- public HASHTBL fight_monsAtk = HASH_SORT //戦闘中のモンスター key:名前 data:総攻撃ダメージ
- //速度計測用
- public timer_system //全体的な処理速度
- public timer_fwrite //ログファイル書き込み処理速度
- public timer_fwrite_old //表示用
- public timer_slogm //システムログメモリ読み出し処理速度
- public timer_chatm //チャットログメモリ読み出し処理速度
- public timer_slogf //システムログ整形処理速度
- public timer_chatf //チャットログ整形処理速度
- public timer_slogp //システムログ表示処理速度
- public timer_chatp //チャットログ表示処理速度
- public timer_sellf //討伐売り整形処理速度
- public timer_battf //戦闘データ整形処理速度
- public timer_stamf //ステータスデータ取得整形処理速度
- //処理切替用
- public tgl_slog //システムログ
- public tgl_chat //システムチャット
- public tgl_sell //討伐売り整形表示
- public tgl_batt //戦闘データ整形表示
- //システム チャット保存用
- public HASHTBL syslog_time = HASH_SORT
- public HASHTBL syslog_type = HASH_SORT
- public HASHTBL syslog_str = HASH_SORT
- public HASHTBL syslog_wflg = HASH_SORT //ファイル書込チェック用
- public HASHTBL syslog_bflg = HASH_SORT //戦闘データ処理チェック用
- public HASHTBL chtlog_time = HASH_SORT
- public HASHTBL chtlog_srcid = HASH_SORT
- public HASHTBL chtlog_desid = HASH_SORT
- public HASHTBL chtlog_room = HASH_SORT
- public HASHTBL chtlog_tmp = HASH_SORT
- public HASHTBL chtlog_src = HASH_SORT
- public HASHTBL chtlog_des = HASH_SORT
- public HASHTBL chtlog_str = HASH_SORT
- public HASHTBL chtlog_wflg = HASH_SORT //ファイル書込チェック用
- public HASHTBL chtlog_head = HASH_SORT //表示先頭保持用
- public HASHTBL cell_data = HASH_SORT //討伐売り纏め用
- public HASHTBL batt_data = HASH_SORT //戦闘データ纏め用
- //charBA(n) + $E8 → キャラクター名
- //charBA(n) + $10C → キャラクタID(サポは$00000000)
- //charBA(n) + $121 → 職種類
- //charBA(n) + $122 → LV
- //charBA(n) + $124 → HPmax
- //charBA(n) + $126 → MPmax
- //charBA(n) + $13C → HPnow
- //charBA(n) + $13E → MPnow
- public HASHTBL sta_name //ステータス キャラ名
- public HASHTBL sta_id //ステータス キャラID
- public HASHTBL sta_job //ステータス 職業
- public HASHTBL sta_lv //ステータス レベル
- public HASHTBL sta_hpmax //ステータス HP最大値
- public HASHTBL sta_mpmax //ステータス MP最大値
- public HASHTBL sta_hpnow //ステータス HP現在値
- public HASHTBL sta_mpnow //ステータス MP現在値
- //[攻 ス フ 結 速 魔 回] 聖 女 天 盾 守 会 捨 衣 ポ 反 転 rH rM 炎 氷 風 闇 光 魅 避 詠 ラ テ
- //女 守 反 転 rH rM 炎 氷 風 闇 光 避
- //バフetc表示用
- //buff2 強化が2段階あるバフ
- //buff1 強化無しのバフ
- //castm キャストタイムのある技(自分用)
- //nameにログで探す文字列 バフ(技)名
- public DIM buff2_name[] = "こうげき力", _
- "しゅび力", _
- "ブレス耐性", _
- "呪文耐性", _
- "コマンド間隔", _
- "呪文の威力", _
- "呪文の回復"
- //表示用 バフ(技)名
- public DIM buff2_sname[] = "攻", _
- "ス", _
- "フ", _
- "結", _
- "速", _
- "魔", _
- "回"
- //各バフの効果時間
- public DIM buff2_maxt[] = 120, _
- 120, _
- 120, _
- 120, _
- 120, _
- 120, _
- 120
- //効果段階と開始時間
- public DIM buff2_rank[length(buff2_name)][5]
- public DIM buff2_stat[length(buff2_name)][5]
- //一段階バフ Aタイプ (重ね掛け時のログが別のもの)
- //の 重さアップの 効果延長!
- //の みりょくアップの 効果延長!
- //sets 開始文字列
- //rets 終了文字列
- //exts 延長文字列
- public DIM buff1a_stas[] = "重さが ふ", _
- "みりょくが あ", _
- "炎のチカラを", _
- "氷のチカラを", _
- "風と雷のチカラを", _
- "闇と土のチカラを", _
- "光のチカラを"
- public DIM buff1a_ends[] = "重さが も", _
- "みりょくが も", _
- "ファイアフォースが と", _
- "アイスフォースが と", _
- "ストームフォースが と", _
- "ダークフォースが と", _
- "ライトフォースが と"
- public DIM buff1a_exts[] = "重さアップの 効", _
- "みりょくアップの 効", _
- "ファイアフォースの 効", _
- "アイスフォースの 効", _
- "ストームフォースの 効", _
- "ダークフォースの 効", _
- "ライトフォースの 効"
- //表示用 バフ(技)名
- public DIM buff1a_sname[] = "重", _
- "魅", _
- "炎", _
- "氷", _
- "風", _
- "闇", _
- "光"
- //各バフの効果時間
- public DIM buff1a_maxt[] = 90, _
- 180, _
- 120, _
- 120, _
- 120, _
- 120, _
- 120
- //効果段階と経過時間
- public DIM buff1a_rank[length(buff1a_stas)][5]
- public DIM buff1a_stat[length(buff1a_stas)][5]
- //一段階バフ Bタイプ (重ね掛け時のログが同じもの)
- //sets 開始文字列
- //rets 終了文字列
- public DIM buff1b_stas[] = "マホステ効", _
- "マホトラのころもを", _
- "会心ガード!", _
- "盾で ガ", _
- "悪い効果に かかりに", _
- "聖女の守りを", _
- "美しさに み"
- public DIM buff1b_ends[] = "マホステが", _
- "マホトラのころもが", _
- "会心ガードが", _
- "盾ガード率", _
- "キラキラポーンが き", _
- "聖女の守りが", _
- "すっぴんに も"
- //表示用 バフ(技)名
- public DIM buff1b_sname[] = "捨", _
- "衣", _
- "会", _
- "盾", _
- "ポ", _
- "聖", _
- "メ"
- //各バフの効果時間
- public DIM buff1b_maxt[] = 60, _
- 60, _
- 120, _
- 180, _
- 120, _
- 120, _
- 120
- //効果段階と経過時間
- public DIM buff1b_rank[length(buff1b_stas)][5]
- public DIM buff1b_stat[length(buff1b_stas)][5]
- //一段階バフ Cタイプ (個別用)
- //表示用 バフ(技)名
- public DIM buff1c_sname[] = "詠", _
- "ラ"
- //各バフの効果時間
- public DIM buff1c_maxt[] = 120, _
- 60
- //効果段階と経過時間
- public DIM buff1c_rank[length(buff1c_sname)][5]
- public DIM buff1c_stat[length(buff1c_sname)][5]
- //キャストタイムの計測
- //castm[技名]=使用時刻
- public HASHTBL castm
- //HASHTBL 変数
- //HASHTBL 変数 = HASH_CASECARE // 大文字小文字を区別する(デフォルトは区別しない)
- //HASHTBL 変数 = HASH_SORT // 順列で読出す時にキーはソートされている
- //変数[キー] = データ
- //変数[キー, HASH_EXISTS] // キーが存在すればTrueを返す
- //変数[キー, HASH_REMOVE] // 削除できればTrueを返す
- //変数[順列番号, HASH_KEY] // キーを返す
- //変数[順列番号, HASH_VAL] // 値を返す
- //変数 = HASH_REMOVEALL //
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //各種設定
- //システムログ読込アドレス
- logSystmSta = 0
- logSystmEnd = 0
- //読み込みエラー対策
- slogIdLast = 0
- //最終処理通番初期化
- info_slog_last = 0
- info_chat_last = 0
- info_sell_last = 0
- info_batt_last = 0
- //データ保持数初期化
- info_slog_keep = 0
- info_chat_keep = 0
- //デバッグログ初期化
- info_sysm_str = ""
- info_slog_str = ""
- info_chat_str = ""
- info_sell_str = ""
- info_batt_str = ""
- //表示位置初期化
- info_sysm_x = 0
- info_sysm_y = 0
- //初回比較時用
- logBA = -1
- staBA = -1
- //戦闘データ処理用
- batt_sta_id = 0
- batt_end_id = 0
- //バフ情報初期化
- for i=0 TO length(buff2_name) - 1
- for j=0 TO 5 - 1
- buff2_rank[i][j] = 0
- next
- next
- for i=0 TO length(buff1a_stas) - 1
- for j=0 TO 5 - 1
- buff1a_rank[i][j] = 0
- next
- next
- for i=0 TO length(buff1b_stas) - 1
- for j=0 TO 5 - 1
- buff1b_rank[i][j] = 0
- next
- next
- //出力用日付取得 パス決定
- GETTIME()
- clogpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_chat.log"
- slogpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_slog.log"
- dbgpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_debug.log"
- //エラーログ出力先
- Option LogPath = GET_CUR_DIR + "\" + "dqxlog4u_error.log"
- LOGPRINT(false)
- //LOGPRINT(true,0,0,512,1020)//debug用
- //タイマー初期化
- timer_system = 0
- timer_slogm = 0
- timer_chatm = 0
- timer_slogf = 0
- timer_chatf = 0
- timer_stamf = 0
- //切替初期化
- tgl_slog = def_slog
- tgl_chat = def_chat
- tgl_sell = def_sell
- tgl_batt = def_batt
- //スレッド排他制御
- info_sysm_trd = Mutex.Init("info_sysm_trd")
- info_slog_trd = Mutex.Init("info_slog_trd")
- info_chat_trd = Mutex.Init("info_chat_trd")
- info_sell_trd = Mutex.Init("info_sell_trd")
- info_batt_trd = Mutex.Init("info_batt_trd")
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //開始
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //初回のプロセスとベースアドレス情報取得
- processCHK()
- //随時出力用カウンタ
- OLogcnt = 0
- OChtcnt = 0
- //戦闘用
- fight_flg = 0
- fight_sta = 0
- //プロセス取得までループ
- While processCHK() = false
- Sleep(1)
- Wend
- //各表示スレッド処理
- tgl_log_full = true //表示位置 true:全画面用 falase:ウィンドウ用(右側)
- THREAD TRD_info_sysm()
- THREAD TRD_info_slog()
- THREAD TRD_info_chat()
- THREAD TRD_info_sell()
- THREAD TRD_info_batt()
- //ログファイル出力
- //重いのでスレッド
- THREAD TRD_log_output()
- While true
- timer_system = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_sysm_trd)
- info_sysm_str = ""
- //LogBaseAddrを取得してチェック
- IFB false = logBaseCHK()
- info_sysm_str = info_sysm_str + "logBaseCHK:NG"
- Mutex.Unlock("info_sysm_trd",info_sysm_trd)
- //失敗時はプロセス情報も再チェック
- Odbg("logBaseCHK():checkNG recheck")
- processCHK()
- //キャラ変更などの為 リセット (起動している限りは連番?)
- Mutex.Lock(info_slog_trd)
- info_slog_str = ""
- slogIdLast = 0
- syslog_time = HASH_REMOVEALL
- syslog_type = HASH_REMOVEALL
- syslog_str = HASH_REMOVEALL
- syslog_wflg = HASH_REMOVEALL
- syslog_bflg = HASH_REMOVEALL
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- Mutex.Lock(info_chat_trd)
- info_chat_str = ""
- chtlog_time = HASH_REMOVEALL
- chtlog_srcid = HASH_REMOVEALL
- chtlog_desid = HASH_REMOVEALL
- chtlog_room = HASH_REMOVEALL
- chtlog_tmp = HASH_REMOVEALL
- chtlog_src = HASH_REMOVEALL
- chtlog_des = HASH_REMOVEALL
- chtlog_str = HASH_REMOVEALL
- chtlog_wflg = HASH_REMOVEALL
- chtlog_head = HASH_REMOVEALL
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- Mutex.Lock(info_sell_trd)
- info_sell_str = ""
- cell_data = HASH_REMOVEALL
- Mutex.Unlock("info_sell_trd",info_sell_trd)
- Sleep(5)
- Continue
- ELSE
- info_sysm_str = info_sysm_str + "logBaseCHK:OK" + "<#CR>"
- ENDIF
- //ステータス
- staBaseCHK()
- IF GETKEYSTATE(VK_F5) Then tgl_slog = !tgl_slog
- IF GETKEYSTATE(VK_F6) Then tgl_chat = !tgl_chat
- IF GETKEYSTATE(VK_F7) Then tgl_sell = !tgl_sell
- IF GETKEYSTATE(VK_F8) Then tgl_batt = !tgl_batt
- IFB GETKEYSTATE(VK_F9)
- processCHK()//ウィンドウサイズ変更に追従
- tgl_log_full = !tgl_log_full
- ENDIF
- //SystemLog
- GetSlogMemFormat()
- IFB tgl_slog
- GetSlogPrint()
- ELSE
- //無効化時
- // timer_slogm = 0
- // timer_slogf = 0
- timer_slogp = 0
- ENDIF
- //ChatLog
- GetChatMemFormat()
- IFB tgl_chat
- GetChatPrint()
- ELSE
- //無効化時
- // timer_chatm = 0
- // timer_chatf = 0
- timer_chatp = 0
- ENDIF
- //討伐売り
- IFB tgl_sell
- sellFormat()
- ELSE
- //無効化時
- timer_sellf = 0
- ENDIF
- //戦闘データ
- IFB tgl_batt
- battFormat()
- ELSE
- //無効化時
- timer_stamf = 0
- timer_battf = 0
- ENDIF
- timer_system = (GETTIME() * 1000 + G_TIME_ZZ) - timer_system
- info_sysm_str = info_sysm_str + "保持データ数 "
- info_sysm_str = info_sysm_str + " システム:" + info_slog_keep
- info_sysm_str = info_sysm_str + " チャット:" + info_chat_keep
- info_sysm_str = info_sysm_str + "<#CR>"
- info_sysm_str = info_sysm_str + "システムF5:" + tgl_slog
- info_sysm_str = info_sysm_str + " チャットF6:" + tgl_chat
- info_sysm_str = info_sysm_str + " 討伐情報F7:" + tgl_sell
- info_sysm_str = info_sysm_str + " 戦闘情報F8:" + tgl_batt
- info_sysm_str = info_sysm_str + " 表示切替F9:" + tgl_log_full
- info_sysm_str = info_sysm_str + "<#CR>"
- // "SysLog Mem Format Print|Chat Mem Format Print| sell|status batt| loop overhead(ms)"
- // 00000 00000 00000| 00000 00000 00000|00000| 00000 00000|00000 00000
- // 12345 12 1 |123 12 1 | 1 1 1234 1234
- info_sysm_str = info_sysm_str + "SysLog Mem Format Print|Chat Mem Format Print| sell|status batt| loop overhead(ms)" + "<#CR>"
- info_sysm_str = info_sysm_str + " "
- info_sysm_str = info_sysm_str + format(timer_slogm ,5) + " "
- info_sysm_str = info_sysm_str + format(timer_slogf ,5) + " "
- info_sysm_str = info_sysm_str + format(timer_slogp ,5) + "| "
- info_sysm_str = info_sysm_str + format(timer_chatm ,5) + " "
- info_sysm_str = info_sysm_str + format(timer_chatf ,5) + " "
- info_sysm_str = info_sysm_str + format(timer_chatp ,5) + "|"
- info_sysm_str = info_sysm_str + format(timer_sellf ,5) + "| "
- info_sysm_str = info_sysm_str + format(timer_stamf ,5) + " "
- info_sysm_str = info_sysm_str + format(timer_battf ,5) + "|"
- info_sysm_str = info_sysm_str + format(timer_system,5) + " "
- info_sysm_str = info_sysm_str + format(timer_system - _
- (timer_slogm + timer_slogf + timer_slogp + timer_chatm + timer_chatf + timer_chatp + timer_sellf + timer_battf),5) _
- + " " + "<#CR>"
- //戦闘情報
- fight_info()
- //メモリチェックインターバル
- tmp_st = VAL(format( (mciv - timer_system) / 1000 ,5,3))
- info_sysm_str = info_sysm_str + "sleep:" + format(tmp_st,8) + "<#CR>"
- info_sysm_str = info_sysm_str + "write_sleep:" + format(timer_fwrite_old,8) //最終行の改行は無し
- Mutex.Unlock("info_sysm_trd",info_sysm_trd)
- IFB tmp_st > 0
- Sleep(tmp_st)
- Else
- //時間超過
- Sleep(0.001)
- ENDIF
- // ExitExit
- WEND
- Mutex.Release("info_sysm_trd",info_sysm_trd)
- Mutex.Release("info_slog_trd",info_slog_trd)
- Mutex.Release("info_chat_trd",info_chat_trd)
- Mutex.Release("info_sell_trd",info_sell_trd)
- Mutex.Release("info_batt_trd",info_batt_trd)
- ExitExit
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //終了
- ///////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////
- // DLL定義
- DEF_DLL GetWindowThreadProcessId(HWND,Var DWORD) :DWORD :User32.dll
- DEF_DLL OpenProcess(DWORD,BOOL,DWORD) :DWORD :Kernel32.dll
- DEF_DLL ReadProcessMemory(DWORD,DWORD,Var byte[], DWORD, Var DWORD):BOOL:kernel32.dll
- DEF_DLL CloseHandle(DWORD) :BOOL :Kernel32.dll
- DEF_DLL GetProcAddress(DWORD, string): DWORD: kernel32.dll
- DEF_DLL CreateToolhelp32Snapshot( Long, Long) :Long :Kernel32.dll
- //typedef struct tagMODULEENTRY32 {
- // DWORD dwSize;
- // DWORD th32ModuleID;
- // DWORD th32ProcessID;
- // DWORD GlblcntUsage;
- // DWORD ProccntUsage;
- // BYTE *modBaseAddr;
- // DWORD modBaseSize;
- // HMODULE hModule;
- // TCHAR szModule[MAX_MODULE_NAME32 + 1];
- // TCHAR szExePath[MAX_PATH];
- //} MODULEENTRY32, *PMODULEENTRY32;
- //DEF_DLL Module32First( Long, MODULEENTRY32) :Long :Kernel32.dll
- DEF_DLL Module32First( Long,{ DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD,string , string} ) :BOOL :Kernel32.dll
- //int MultiByteToWideChar(
- // UINT CodePage, // コードページ
- // DWORD dwFlags, // 文字の種類を指定するフラグ
- // LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
- // int cchMultiByte, // マップ元文字列のバイト数
- // LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス
- // int cchWideChar // バッファのサイズ
- //);
- DEF_DLL MultiByteToWideChar(dword, dword, byte[], int, var wstring, int): int: kernel32.dll
- CONST CP_ACP = 0 // default to ANSI code page
- CONST CP_OEMCP = 1 // default to OEM code page
- CONST CP_MACCP = 2 // default to MAC code page
- CONST CP_THREAD_ACP = 3 // current thread's ANSI code page
- CONST CP_SYMBOL = 42 // SYMBOL translations
- CONST CP_UTF7 = 65000 // UTF-7 translation
- CONST CP_UTF8 = 65001 // UTF-8 translation
- CONST ERROR_INVALID_PARAMETER = 87 // dderror
- CONST ERROR_INSUFFICIENT_BUFFER = 122 // dderror
- CONST ERROR_INVALID_FLAGS = 1004
- CONST ERROR_NO_UNICODE_TRANSLATION = 1113
- DEF_DLL MultiByteToWideChar(dword, dword, byte[], int, var wstring, int): int: kernel32.dll
- CONST MB_PRECOMPOSED = $00000001 // use precomposed chars
- CONST MB_COMPOSITE = $00000002 // use composite chars
- CONST MB_USEGLYPHCHARS = $00000004 // use glyph chars, not ctrl chars
- CONST MB_ERR_INVALID_CHARS = $00000008 // error for invalid chars
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //ユーザー定義
- //スクリプト状態表示(スレッド処理)
- PROCEDURE TRD_info_sysm()
- info_sysm_str = "start"
- FUKIDASI(info_sysm_str,info_sysm_x,info_sysm_y,0,8,"MS 明朝",$FFFF00,$000000,-2)
- //FUKIDASI ID取得
- info_sysm_id = GETID(GET_FUKIDASI_WIN)
- IFB -1 = info_sysm_id
- MSGBOX("Ffukidsi:NG")
- ExitExit
- ENDIF
- WHILE true
- Mutex.Lock(info_sysm_trd)
- //<#CR>毎の長さを測定
- max_len = 0
- arry_info_sysm = SPLIT(info_sysm_str,"<#CR>",FALSE,FALSE)
- FOR i = 0 TO (LENGTH(arry_info_sysm) - 1)
- IF max_len < LENGTHB(arry_info_sysm[i]) Then max_len = LENGTHB(arry_info_sysm[i])
- NEXT
- //最大長にパディング(右寄せ)
- tmpinfo_sysm = ""
- FOR i = 0 TO (LENGTH(arry_info_sysm) - 1)
- tmpinfo_sysm = tmpinfo_sysm + format(" ",max_len - LENGTHB(arry_info_sysm[i]) ) + arry_info_sysm[i] + "<#CR>"
- NEXT
- //表示位置決め
- IFB tgl_log_full
- info_sysm_x = ( tgl_log_clix + ( tgl_log_cliw / 2 ) ) - ( STATUS(info_sysm_id,ST_WIDTH) / 2 )
- info_sysm_y = tgl_log_cliy
- info_sysm_trans = -2
- ELSE
- info_sysm_x = tgl_log_dqxx + tgl_log_dqxw
- info_sysm_y = tgl_log_dqxy
- info_sysm_trans = 0
- ENDIF
- FUKIDASI(tmpinfo_sysm,info_sysm_x,info_sysm_y,0,8,"MS 明朝",$FFFF00,$000001,info_sysm_trans)
- info_sysm_h = STATUS(info_sysm_id,ST_HEIGHT)
- Mutex.Unlock("info_sysm_trd",info_sysm_trd)
- Sleep(0.1)
- Wend
- FEND
- //システムログ表示(スレッド処理)
- PROCEDURE TRD_info_slog()
- info_slog_x = 0
- info_slog_y = 20
- info_slog_str = "start"
- FUKIDASI(info_slog_str,info_slog_x,info_slog_y,0,8,"MS 明朝",$FFFFFF,$000000,-2)
- //FUKIDASI ID取得
- info_slog_id = GETID(GET_FUKIDASI_WIN)
- IFB -1 = info_slog_id
- MSGBOX("Ffukidsi:NG")
- ExitExit
- ENDIF
- WHILE true
- IFB tgl_slog
- Mutex.Lock(info_slog_trd)
- //固定行分のみ表示
- ret = POS( "<#CR>" , info_slog_str , 0 - ( info_slog_max + 1 ))
- //表示位置決め
- IFB tgl_log_full
- info_slog_x = tgl_log_clix
- info_slog_trans = -2
- ELSE
- info_slog_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
- info_slog_trans = 0
- ENDIF
- info_slog_y = info_sysm_y + info_sysm_h
- FUKIDASI( COPY( info_slog_str , ret +1 ) ,info_slog_x,info_slog_y,0,8,"MS 明朝",$FFFFFF,$000001,info_slog_trans)
- info_slog_h = STATUS(info_slog_id,ST_HEIGHT)
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- ELSE
- info_slog_h = 0
- FUKIDASI()
- ENDIF
- Sleep(0.1)
- Wend
- FEND
- //チャットログ表示(スレッド処理)
- PROCEDURE TRD_info_chat()
- info_chat_x = 0
- info_chat_y = 40
- info_chat_str = "start"
- FUKIDASI(info_chat_str,info_chat_x,info_chat_y,0,8,"MS 明朝",$00FFFF,$000000,-2)
- //FUKIDASI ID取得
- info_chat_id = GETID(GET_FUKIDASI_WIN)
- IFB -1 = info_chat_id
- MSGBOX("Ffukidsi:NG")
- ExitExit
- ENDIF
- WHILE true
- IFB tgl_chat
- Mutex.Lock(info_chat_trd)
- //固定行分のみ表示
- ret = POS( "<#CR>" , info_chat_str , 0 - ( info_chat_max + 1 ) )
- //表示位置決め
- IFB tgl_log_full
- info_chat_x = tgl_log_clix
- info_chat_trans = -2
- ELSE
- info_chat_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
- info_chat_trans = 0
- ENDIF
- info_chat_y = info_sysm_y + info_sysm_h + info_slog_h
- FUKIDASI( COPY( info_chat_str , ret + 1 ) ,info_chat_x,info_chat_y,0,8,"MS 明朝",$00FFFF,$000001,info_chat_trans)
- info_chat_h = STATUS(info_chat_id,ST_HEIGHT)
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- ELSE
- info_chat_h = 0
- FUKIDASI()
- ENDIF
- Sleep(0.1)
- Wend
- FEND
- //討伐整形表示(スレッド処理)
- PROCEDURE TRD_info_sell()
- info_sell_x = 0
- info_sell_y = 60
- info_sell_str = "start"
- FUKIDASI(info_sell_str,info_sell_x,info_sell_y,0,8,"MS 明朝",$FF00FF,$000000,-2)
- //FUKIDASI ID取得
- info_sell_id = GETID(GET_FUKIDASI_WIN)
- IFB -1 = info_sell_id
- MSGBOX("Ffukidsi:NG")
- ExitExit
- ENDIF
- WHILE true
- IFB tgl_sell
- Mutex.Lock(info_sell_trd)
- //固定行分のみ表示
- ret = POS( "<#CR>" , info_sell_str , 0 - ( info_sell_max + 1 ) )
- //表示位置決め
- IFB tgl_log_full
- info_sell_x = tgl_log_clix
- info_sell_trans = -2
- ELSE
- info_sell_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
- info_sell_trans = 0
- ENDIF
- info_sell_y = info_sysm_y + info_sysm_h + info_slog_h + info_chat_h
- FUKIDASI( COPY( info_sell_str , ret + 1 ) ,info_sell_x,info_sell_y,0,8,"MS 明朝",$FF00FF,$000001,info_sell_trans)
- info_sell_h = STATUS(info_sell_id,ST_HEIGHT)
- Mutex.Unlock("info_sell_trd",info_sell_trd)
- ELSE
- info_sell_h = 0
- FUKIDASI()
- ENDIF
- Sleep(0.1)
- Wend
- FEND
- //戦闘データ整形表示(スレッド処理)
- PROCEDURE TRD_info_batt()
- info_batt_x = 0
- info_batt_y = 80
- info_batt_str = "start"
- FUKIDASI(info_batt_str,info_batt_x,info_batt_y,0,8,"MS 明朝",$FFFFFF,$000000,-2)
- //FUKIDASI ID取得
- info_batt_id = GETID(GET_FUKIDASI_WIN)
- IFB -1 = info_batt_id
- MSGBOX("Ffukidsi:NG")
- ExitExit
- ENDIF
- WHILE true
- IFB tgl_batt
- Mutex.Lock(info_batt_trd)
- //<#CR>毎の長さを測定
- //最大長にパディング(右寄せ)
- // max_len = 0
- // arry_info_batt = SPLIT(info_batt_str,"<#CR>",FALSE,FALSE)
- // FOR i = 0 TO (LENGTH(arry_info_batt) - 1)
- // IF max_len < LENGTHB(arry_info_batt[i]) Then max_len = LENGTHB(arry_info_batt[i])
- // NEXT
- // tmpinfo_batt = ""
- // FOR i = 0 TO (LENGTH(arry_info_batt) - 1)
- // tmpinfo_batt = tmpinfo_batt + format(" ",max_len - LENGTHB(arry_info_batt[i]) ) + arry_info_batt[i] + "<#CR>"
- // NEXT
- //通常
- tmpinfo_batt = info_batt_str
- //表示位置決め
- IFB tgl_log_full
- // info_batt_x = tgl_log_clix + tgl_log_cliw - STATUS(info_batt_id,ST_WIDTH)
- //コマンドウィンドウ基準
- info_batt_x = tgl_log_clix + 30
- info_batt_y = tgl_log_cliy + tgl_log_clih - info_batt_h - 260
- info_batt_trans = -2
- ELSE
- info_batt_x = tgl_log_dqxx + tgl_log_dqxw
- info_batt_y = info_sysm_y + info_sysm_h
- info_batt_trans = 0
- ENDIF
- //2箇所の色をとって文字色切替
- chkBG = 0
- chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_R)
- chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_G)
- chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_B)
- chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_R)
- chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_G)
- chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_B)
- chkBG = chkBG / 6
- IFB chkBG < 128
- colFG = $FFFFFF
- ELSE
- colFG = $000000
- ENDIF
- FUKIDASI( tmpinfo_batt ,info_batt_x,info_batt_y,0,8,"MS 明朝",colFG,$000001,info_batt_trans)
- info_batt_h = STATUS(info_batt_id,ST_HEIGHT)
- info_batt_w = STATUS(info_batt_id,ST_WIDTH)
- Mutex.Unlock("info_batt_trd",info_batt_trd)
- ELSE
- info_batt_h = 0
- info_batt_w = 0
- FUKIDASI()
- ENDIF
- Sleep(0.1)
- Wend
- FEND
- //デバッグログ出力
- //YY/MM/DD HH:MM.ss ログ文字列
- PROCEDURE Odbg(dbgstr)
- IFB FDBG
- fid = FOPEN(dbgpath, F_READ or F_WRITE)
- GETTIME()
- timestamp = G_TIME_YY + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + "." + G_TIME_SS2 + " "
- FPUT(fid, timestamp + dbgstr )
- FCLOSE(fid)
- ENDIF
- FEND
- //DWORD値をANSI文字列に 4byte分のみ
- FUNCTION dword2char(num)
- tmpstr = FORMAT(num,8,-1)
- str = CHRB(VAL("$"+COPY(tmpstr,7,2),0)) + CHRB(VAL("$"+COPY(tmpstr,5,2),0)) + CHRB(VAL("$"+COPY(tmpstr,3,2),0)) + CHRB(VAL("$"+COPY(tmpstr,1,2),0))
- RESULT = str
- FEND
- //配列をANSIとして文字変換
- FUNCTION byte2ansi(byte_array[])
- IFB true
- MSGBOX("byte2ansi:未実装")
- ExitExit
- ELSE
- MSGBOX("byte2ansi:未実装")
- ExitExit
- ENDIF
- RESULT = "未実装"
- Exit
- FEND
- //配列をUTF8として文字変換
- //簡略化のため3Byte文字まで
- FUNCTION byte2utf8(byte_array[])
- // Odbg("byte2utf8 :" + LENGTH(byte_array) )
- retstr = ""
- tmpchr = 0
- i = 0
- WHILE i < LENGTH(byte_array) - 1
- // Odbg("base:" + FORMAT(byte_array[i],2,-1) )
- IFB (byte_array[i] and $E0) = $E0 //1110 0000
- //3byte top
- // Odbg("3byt:" + (byte_array[i] and $F) )//0000 1111
- tmpchr = 0
- tmpchr = tmpchr + (byte_array[i ] and $F ) * $1000 //0000 1111 0000 0000 0000 0000 →1111 00 0000 00 0000
- tmpchr = tmpchr + (byte_array[i+1] and $3F) * $40 //0000 0000 0011 1111 0000 0000 →0000 11 1111 00 0000
- tmpchr = tmpchr + (byte_array[i+2] and $3F) * $1 //0000 0000 0000 0000 0011 1111 →0000 00 0000 11 1111
- // Odbg("orig:" + REPLACE(FORMAT(byte_array[i],2,-1) + FORMAT(byte_array[i+1],2,-1) + FORMAT(byte_array[i+2],2,-1)," ","0") )
- // Odbg("code:" + tmpchr )
- // Odbg("utf8:" + chr(tmpchr) )
- retstr = retstr + chr(tmpchr)
- i = i + 3
- ELSEIF (byte_array[i] and $C0) = $C0 //1100 0000
- //2byte top
- // Odbg("2byt:" + (byte_array[i] and $1F) ) //0001 1111
- tmpchr = 0
- tmpchr = tmpchr + (byte_array[i ] and $1F) * $40 //0001 1111 0000 0000 →1 1111 00 0000
- tmpchr = tmpchr + (byte_array[i+1] and $3F) * $1 //0000 0000 0011 1111 →0 0000 11 1111
- retstr = retstr + chr(tmpchr)
- i = i + 2
- ELSEIF byte_array[i] = $00
- //end of str
- Break
- ELSEIF (byte_array[i] and $00) = $00 //0000 0000
- //1byte top
- // Odbg("1byt:" + (byte_array[i] and $7F) ) //0111 1111
- tmpchr = 0
- tmpchr = tmpchr + (byte_array[i ] and $7F) * $1 //0111 1111 → 111 1111
- retstr = retstr + chr(tmpchr)
- i = i + 1
- ELSE
- Odbg("NG:UTF8")
- i = i + 1
- ENDIF
- WEND
- RESULT = retstr
- Exit
- FEND
- //4byte配列をDword値として数値変換
- FUNCTION byte2dword(byte_array[])
- IFB 4 = LENGTH(byte_array)
- tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 ) + (byte_array[2] * $10000 ) + (byte_array[3] * $1000000)
- // Odbg("byte2dword :" + REPLACE(FORMAT(tmpnum,8,-1)," ","0") )
- RESULT = tmpnum
- Exit
- ELSE
- MSGBOX("byte2dword :配列数エラー:" + LENGTH(byte_array))
- ExitExit
- ENDIF
- Exit
- FEND
- //2byte配列をword値として数値変換
- FUNCTION byte2word(byte_array[])
- IFB 2 = LENGTH(byte_array)
- tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 )
- // Odbg("byte2word :" + REPLACE(FORMAT(tmpnum,8,-1)," ","0") )
- RESULT = tmpnum
- Exit
- ELSE
- MSGBOX("byte2word :配列数エラー:" + LENGTH(byte_array))
- ExitExit
- ENDIF
- Exit
- FEND
- //プロセス情報の更新行う
- //戻り値 true:正常 false:起動してないっぽい
- //uwscID取得後エラーは終了処理
- FUNCTION processCHK()
- //uwsc側ID取得
- DqxWid = GETID("ドラゴンクエストX オンライン")
- IFB -1 = DqxWid
- RESULT = false
- Exit
- ENDIF
- //ログ表示位置用
- tgl_log_dqxx = STATUS(DqxWid,ST_X)
- tgl_log_dqxy = STATUS(DqxWid,ST_Y)
- tgl_log_dqxw = STATUS(DqxWid,ST_WIDTH)
- tgl_log_dqxh = STATUS(DqxWid,ST_HEIGHT)
- tgl_log_clix = STATUS(DqxWid,ST_CLX)
- tgl_log_cliy = STATUS(DqxWid,ST_CLY)
- tgl_log_cliw = STATUS(DqxWid,ST_CLWIDTH)
- tgl_log_clih = STATUS(DqxWid,ST_CLHEIGHT)
- DqxPid = 0
- //uwscID→プロセスID
- ret = GetWindowThreadProcessId(IDtoHND(DqxWid),DqxPid)
- Odbg("dqxプロセスID :" + DqxPid)
- Odbg("親スレッドID :" + ret)
- //プロセスID→ASLR用ベースアドレス
- hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, DqxPid)
- Odbg("hModuleSnap :" + hModuleSnap)
- dwSize = (4 * 8) + 256 + 260
- th32ModuleID = 0
- th32ProcessID = 0
- GlblcntUsage = 0
- ProccntUsage = 0
- modBaseAddr = 0
- modBaseSize = 0
- hModule = 0
- szModule = FORMAT(ChrB(0), 256)
- szExePath = FORMAT(ChrB(0), 260)
- ret = Module32First(hModuleSnap,dwSize,th32ModuleID,th32ProcessID,GlblcntUsage,ProccntUsage,modBaseAddr,modBaseSize,hModule,szModule,szExePath)
- IF ret = false
- MSGBOX("NG:Module32First")
- ExitExit
- ENDIF
- //数値へ変換
- dwSize = VAL(dwSize )
- th32ModuleID = VAL(th32ModuleID )
- th32ProcessID = VAL(th32ProcessID)
- GlblcntUsage = VAL(GlblcntUsage )
- ProccntUsage = VAL(ProccntUsage )
- modBaseAddr = VAL(modBaseAddr )
- modBaseSize = VAL(modBaseSize )
- hModule = VAL(hModule )
- Odbg("dwSize :" + dwSize )
- Odbg("th32ModuleID :" + th32ModuleID )
- Odbg("th32ProcessID :" + th32ProcessID )
- Odbg("GlblcntUsage :" + GlblcntUsage )
- Odbg("ProccntUsage :" + ProccntUsage )
- Odbg("modBaseAddr :" + modBaseAddr )
- Odbg("modBaseSize :" + modBaseSize )
- Odbg("hModule :" + hModule )
- Odbg("szModule :" + szModule )
- Odbg("szExePath :" + szExePath )
- DqxBaseAddr = modBaseAddr
- Odbg("DqxBaseAddr :" + REPLACE(FORMAT(DqxBaseAddr,8,-1)," ","0") )
- //プロセスID→ログベースアドレスの取得
- DqxPhnd = OpenProcess(PROCESS_VM_READ, false, DqxPid);
- Odbg("OpenProcessid :" + DqxPhnd )
- RESULT = true
- Exit
- FEND
- //LogBaseAddressの更新行う
- //戻り値 true:正常 false:ログイン時かログがまだ無い場合
- FUNCTION logBaseCHK()
- // Odbg("logBase Search :" + REPLACE(FORMAT(DqxBaseAddr + logPO,8,-1)," ","0") )
- buff_readcnt = 0
- DIM buff_dword[ArryDwordSize - 1]
- IFB false = ReadProcessMemory(DqxPhnd, DqxBaseAddr + logPO , buff_dword , 4, buff_readcnt)
- Odbg("NG:ReadProcessMemory:logBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- now_logBA = byte2dword(buff_dword)
- //0の場合はやり直し
- IFB 0 = now_logBA
- Odbg("logBA( ,new) :0")
- logBA = now_logBA//リセットしておく
- RESULT = false
- Exit
- ENDIF
- //前回取得時と同じ場合はOK
- IFB logBA = now_logBA
- // Odbg("logBA(old,new) :" + logBA + "=" + now_logBA )
- RESULT = true
- Exit
- ENDIF
- Odbg("logBA Search :" + REPLACE(FORMAT(DqxBaseAddr + logPO,8,-1)," ","0") )
- Odbg("logBA(old,new) :" + logBA + "<>" + now_logBA )
- //更新処理
- logBA = now_logBA
- logBAsytm = logBA + logDOsytm
- logBAchat = logBA + logDOchat
- Odbg("logBA :" + REPLACE(FORMAT(logBA,8,-1)," ","0") )
- Odbg("logBAsytm :" + REPLACE(FORMAT(logBAsytm,8,-1)," ","0") )
- Odbg("logBAchat :" + REPLACE(FORMAT(logBAchat,8,-1)," ","0") )
- RESULT = true
- Exit
- FEND
- //StatusBaseAddressの更新行う
- //戻り値 true:正常 false:ログイン時かログがまだ無い場合
- FUNCTION staBaseCHK()
- // Odbg("staBase Search :" + REPLACE(FORMAT(DqxBaseAddr + staPO,8,-1)," ","0") )
- buff_readcnt = 0
- DIM buff_dword[ArryDwordSize - 1]
- IFB false = ReadProcessMemory(DqxPhnd, DqxBaseAddr + staPO , buff_dword , 4, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- now_staBA = byte2dword(buff_dword)
- //0の場合はやり直し
- IFB 0 = now_staBA
- Odbg("staBA( ,new) :0")
- staBA = now_staBA//リセットしておく
- RESULT = false
- Exit
- ENDIF
- //前回取得時と同じ場合はOK
- IFB staBA = now_staBA
- // Odbg("staBA(old,new) :" + staBA + "=" + now_staBA )
- RESULT = true
- Exit
- ENDIF
- Odbg("staBA Search :" + REPLACE(FORMAT(DqxBaseAddr + staPO,8,-1)," ","0") )
- Odbg("staBA(old,new) :" + staBA + "<>" + now_staBA )
- //更新処理
- staBA = now_staBA
- Odbg("staBA :" + REPLACE(FORMAT(staBA,8,-1)," ","0") )
- RESULT = true
- Exit
- FEND
- //システムログメモリデータの取得整形(tmp配列の為結合)
- PROCEDURE GetSlogMemFormat()
- timer_slogm = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_slog_trd)
- //処理前に要らないデータは消しておく
- //
- delnum = Length(syslog_wflg) - 700//クライアント保持分 686 = 24731:MAXサイズ / (4:id + 1:type + 1:len + 30:大体10文字分)
- IF delnum < 0 then delnum = 0//少ない場合
- i = 0
- //ログ通番でソートされているので 古いものから削除
- WHILE i < delnum
- //delnum分先頭を削除処理
- delkey = syslog_wflg[0, HASH_KEY]
- IFB syslog_wflg[delkey, HASH_EXISTS] = false OR syslog_bflg[delkey, HASH_EXISTS] = false
- Odbg("HashNG_sw:" + syslog_wflg[delkey, HASH_EXISTS])
- Odbg("HashNG_sb:" + syslog_bflg[delkey, HASH_EXISTS])
- ELSE
- IFB 1 = syslog_wflg[delkey] AND 1 = syslog_bflg[delkey] //保存済み&処理済み のみ削除対象
- ret = syslog_time[delkey, HASH_REMOVE]
- ret = syslog_type[delkey, HASH_REMOVE]
- ret = syslog_str[ delkey, HASH_REMOVE]
- ret = syslog_wflg[delkey, HASH_REMOVE]
- ret = syslog_bflg[delkey, HASH_REMOVE]
- ENDIF
- ENDIF
- i = i + 1
- WEND
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- // logSystmSta = 0 //システムログ開始アドレス
- // logSystmEnd = 0 //システムログ終了アドレス
- DIM tmp_dword[ArryDwordSize - 1]
- DIM buff_slog[ArrySlogSize - 1]
- buff_readcnt = 0 //読み込みバイト数
- IFB false = ReadProcessMemory(DqxPhnd, logBAsytm - 8 , tmp_dword , 4, buff_readcnt)
- MSGBOX("NG:ReadProcessMemory") ; ExitExit
- ENDIF
- tmplogSystmSta = byte2dword(tmp_dword)
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, logBAsytm - 4 , tmp_dword , 4, buff_readcnt)
- MSGBOX("NG:ReadProcessMemory") ; ExitExit
- ENDIF
- tmplogSystmEnd = byte2dword(tmp_dword)
- //アドレス未変更時は処理しない
- IFB logSystmSta = tmplogSystmSta AND logSystmEnd = tmplogSystmEnd
- timer_slogm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogm
- timer_slogf = 0
- Exit
- ELSE
- logSystmSta = tmplogSystmSta
- logSystmEnd = tmplogSystmEnd
- ENDIF
- //変更されているので読込み
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, logBAsytm , buff_slog , ArrySlogSize, buff_readcnt)
- MSGBOX("NG:ReadProcessMemory") ; ExitExit
- ENDIF
- timer_slogm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogm
- timer_slogf = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_slog_trd)
- //システムログデータ整形
- //開始アドレスが指定されている 場合は 開始アドレス→最終アドレス + 基底アドレス→終了アドレス
- //開始アドレスが指定されていない場合は 基底アドレス→終了アドレス
- //開始アドレスが指定されている
- IFB logSystmSta <> $0
- // Odbg(logSystmSta + "-" + ArrySlogSize)
- i = logSystmSta
- WHILE i < (ArrySlogSize - 1 - 8) //ID+type+Len+str 4+1+1+2 8byteは必要
- // Odbg(i + "/" + ArrySlogSize)
- slogID = byte2dword( SLICE(buff_slog,i,i+3) )
- IF slogID = $0 THEN Break
- //slogID妥当性チェック
- IFB slogIdLast = 0
- slogIdLast = slogID
- ELSEIF slogID = ( slogIdLast + 1 )
- slogIdLast = slogID
- ELSEIF slogID < ( slogIdLast + 2048)
- // print "1oldIDx :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0")
- // print "1nowIDx :" + REPLACE(FORMAT(slogID,8,-1)," ","0")
- slogIdLast = slogID
- ELSE
- Odbg("1oldID :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0") )
- Odbg("1nowID :" + REPLACE(FORMAT(slogID,8,-1)," ","0") )
- Odbg("1slogaddr:" + REPLACE(FORMAT(logBAsytm + i,8,-1)," ","0") )
- Odbg("1slogSta :" + REPLACE(FORMAT(logBAsytm + logSystmSta,8,-1)," ","0") )
- Odbg("1slogEnd :" + REPLACE(FORMAT(logBAsytm + logSystmEnd,8,-1)," ","0") )
- break
- ENDIF
- slogID = REPLACE(FORMAT(slogID,8,-1)," ","0")
- slogLen = buff_slog[i+5]
- IF slogLen = 0 THEN break //deadlock回避
- IFB syslog_wflg[slogID, HASH_EXISTS] //保存済みは飛ばす
- i = i + slogLen
- Continue
- ENDIF
- slogTyp = buff_slog[i+4]
- slogStr = ""
- slogStr = byte2utf8( SLICE(buff_slog,i+6,i+slogLen) )
- // Odbg( _
- // slogID + ":" + _
- // FORMAT(slogTyp,3) + ":" + _
- // FORMAT(slogLen,3) + ":" + _
- // slogStr )
- //格納
- GETTIME()
- syslog_time[slogID] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
- syslog_type[slogID] = slogTyp
- syslog_str[slogID] = slogStr
- syslog_wflg[slogID] = 0
- syslog_bflg[slogID] = 0
- i = i + slogLen
- WEND
- ENDIF
- //基底アドレス→終了アドレス
- i = 0
- WHILE i < (logSystmEnd - 1 - 8) //ID+type+Len+str 4+1+1+1 7byteは必要
- slogID = byte2dword( SLICE(buff_slog,i,i+3) )
- IF slogID = $0 THEN Break
- //slogID妥当性チェック
- IFB slogIdLast = 0
- slogIdLast = slogID
- ELSEIF slogID = ( slogIdLast + 1 )
- slogIdLast = slogID
- ELSEIF slogID < ( slogIdLast + 2048 )
- // print "2oldIDx :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0")
- // print "2nowIDx :" + REPLACE(FORMAT(slogID,8,-1)," ","0")
- slogIdLast = slogID
- ELSE
- Odbg("2oldID :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0") )
- Odbg("2nowID :" + REPLACE(FORMAT(slogID,8,-1)," ","0") )
- Odbg("2slogaddr:" + REPLACE(FORMAT(logBAsytm + i,8,-1)," ","0") )
- Odbg("2slogSta :" + REPLACE(FORMAT(logBAsytm + logSystmSta,8,-1)," ","0") )
- Odbg("2slogEnd :" + REPLACE(FORMAT(logBAsytm + logSystmEnd,8,-1)," ","0") )
- break
- ENDIF
- slogID = REPLACE(FORMAT(slogID,8,-1)," ","0")
- slogLen = buff_slog[i+5]
- IF slogLen = 0 THEN break //deadlock回避
- IFB syslog_wflg[slogID, HASH_EXISTS] //保存済みは飛ばす
- i = i + slogLen
- Continue
- ENDIF
- slogTyp = buff_slog[i+4]
- slogStr = ""
- slogStr = byte2utf8( SLICE(buff_slog,i+6,i+slogLen) )
- //格納
- GETTIME()
- syslog_time[slogID] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
- syslog_type[slogID] = slogTyp
- syslog_str[slogID] = slogStr
- syslog_wflg[slogID] = 0
- syslog_bflg[slogID] = 0
- i = i + slogLen
- WEND
- info_slog_keep = Length(syslog_wflg)
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- timer_slogf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogf
- FEND
- //システムログメモリデータの表示
- PROCEDURE GetSlogPrint()
- timer_slogp = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_slog_trd)
- //表示分のみ処理
- info_slog_str = ""
- i = Length(syslog_wflg) - 1 - info_slog_max
- IF i < 0 then i = 0//MAXより少ない場合
- WHILE i < Length(syslog_wflg)
- info_slog_str = info_slog_str + _
- syslog_wflg[i,HASH_VAL] + ":" + _
- syslog_bflg[i,HASH_VAL] + ":" + _
- syslog_wflg[i,HASH_KEY] + ":" + _
- syslog_time[i,HASH_VAL] + ":" + _
- syslog_type[i,HASH_VAL] + ":" + _
- syslog_str[i,HASH_VAL] + "<#CR>"
- i = i + 1
- Wend
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- timer_slogp = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogp
- FEND
- //チャットログメモリデータの取得整形(tmp配列の為結合)
- PROCEDURE GetChatMemFormat()
- timer_chatm = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_chat_trd)
- //処理前に要らないデータは消しておく
- delnum = Length(chtlog_wflg) - 200//クライアント保持分 180
- IF delnum < 0 then delnum = 0//少ない場合
- i = 0
- WHILE i < delnum
- //delnum分先頭を削除処理
- delkey = chtlog_wflg[0, HASH_KEY]
- IFB chtlog_wflg[delkey, HASH_EXISTS] = false
- Odbg("HashNG_cw:" + chtlog_wflg[delkey, HASH_EXISTS])
- ELSE
- // //保存済みのみ削除対象 先頭50個に保存されていた場合は削除しない
- // IFB 1 = chtlog_wflg[delkey] AND chtlog_head[delkey, HASH_EXISTS] = false
- ret = chtlog_wflg[ delkey, HASH_REMOVE]
- ret = chtlog_time[ delkey, HASH_REMOVE]
- ret = chtlog_srcid[delkey, HASH_REMOVE]
- ret = chtlog_desid[delkey, HASH_REMOVE]
- ret = chtlog_tmp[ delkey, HASH_REMOVE]
- ret = chtlog_room[ delkey, HASH_REMOVE]
- ret = chtlog_src[ delkey, HASH_REMOVE]
- ret = chtlog_des[ delkey, HASH_REMOVE]
- ret = chtlog_str[ delkey, HASH_REMOVE]
- // ENDIF
- ENDIF
- i = i + 1
- WEND
- DIM buff_chat[ArryChatSize - 1]
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, logBAchat , buff_chat , ArryChatSize, buff_readcnt)
- MSGBOX("NG:ReadProcessMemory") ; ExitExit
- ENDIF
- timer_chatm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatm
- timer_chatf = GETTIME() * 1000 + G_TIME_ZZ
- //チャットログデータ整形
- //(180 * 180) + (4 * 180)
- //表示順で最後から処理し
- //Chat通番が0は飛ばす 保存済みが出たら終了
- //
- FOR i = (180 * 180) + (4 * 180) - 4 TO (180 * 180) STEP -4
- //格納位置 = 表示順アドレス - ベースアドレス
- readNum = byte2dword(SLICE(buff_chat,i,i+3)) - logBAchat
- //チャット通番で処理
- chatNum = byte2dword(SLICE(buff_chat,readNum + 8,readNum+11))
- //0は飛ばす
- IFB chatNum = 0
- Continue
- ENDIF
- //保存済みで終了
- chatNum = REPLACE(FORMAT(chatNum,8,-1)," ","0")
- IFB chtlog_time[chatNum, HASH_EXISTS]
- Break
- ENDIF
- //元キャラID 先キャラID Chat通番 何か? ルーム番号? 元キャラ名 先キャラ名 Chat上段 下段
- //4byte 4 4 4 4 19 19 61 61
- charSrcid = byte2charid(SLICE(buff_chat,readNum+ 0,readNum+ 3))
- charDesid = byte2charid(SLICE(buff_chat,readNum+ 4,readNum+ 7))
- chattmp = byte2dword(SLICE(buff_chat,readNum+12,readNum+15))
- chattmp = REPLACE(FORMAT(chattmp,8,-1)," ","0")
- chatroom = byte2dword(SLICE(buff_chat,readNum+16,readNum+19))
- chatroom = REPLACE(FORMAT(chatroom,8,-1)," ","0")
- charSrc = byte2utf8( SLICE(buff_chat,readNum+20+0 ,readNum+20+ 0+18) )
- charDes = byte2utf8( SLICE(buff_chat,readNum+20+19,readNum+20+19+18) )
- //キャラ名をそろえる為にパディング
- paddname_src = format(" ",12 - LENGTHB(charSrc)) + charSrc
- paddname_des = format(" ",12 - LENGTHB(charDes)) + charDes
- chatU = byte2utf8( SLICE(buff_chat,readNum+20+38,readNum+20+38+60) )
- chatD = byte2utf8( SLICE(buff_chat,readNum+20+99,readNum+20+99+60) )
- //格納
- GETTIME()
- chtlog_time[chatNum] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
- chtlog_srcid[chatNum] = charSrcid
- chtlog_desid[chatNum] = charDesid
- chtlog_tmp[chatNum] = chattmp
- chtlog_room[chatNum] = chatroom
- // chtlog_src[chatNum] = charSrc
- // chtlog_des[chatNum] = charDes
- chtlog_src[chatNum] = paddname_src
- chtlog_des[chatNum] = paddname_des
- chtlog_str[chatNum] = chatU + chatD
- chtlog_wflg[chatNum] = 0
- // IF false THEN Odbg( _
- // chatNum + ":" + _
- // charInfoA + ":" + _
- // charInfoB + ":" + _
- // chattmp + ":" + _
- // chatroom + ":" + _
- // FORMAT(" ",12 - LENGTHB(charNameA)) + charNameA + ":" + _
- // FORMAT(" ",12 - LENGTHB(charNameB)) + charNameB + ":" + _
- // FORMAT(" ",20 - LENGTHB(chatU)) + chatU + ":" + _
- // FORMAT(" ",20 - LENGTHB(chatD)) + chatD )
- next
- info_chat_keep = Length(chtlog_wflg)
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- timer_chatf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatf
- FEND
- //チャットログメモリデータの表示
- PROCEDURE GetChatPrint()
- timer_chatp = GETTIME() * 1000 + G_TIME_ZZ
- //表示分のみ処理
- Mutex.Lock(info_chat_trd)
- info_chat_str = ""
- i = Length(chtlog_wflg) - 1 - info_chat_max
- IF i < 0 then i = 0//MAXより少ない場合
- WHILE i < Length(chtlog_wflg)
- info_chat_str = info_chat_str + _
- chtlog_wflg[i,HASH_VAL] + ":" + _
- chtlog_wflg[i,HASH_KEY] + ":" + _
- chtlog_time[i,HASH_VAL] + ":" + _
- chtlog_srcid[i,HASH_VAL] + ":" + _
- chtlog_desid[i,HASH_VAL] + ":" + _
- chtlog_tmp[i,HASH_VAL] + ":" + _
- chtlog_room[i,HASH_VAL] + ":" + _
- chtlog_src[i,HASH_VAL] + ":" + _
- chtlog_des[i,HASH_VAL] + ":" + _
- chtlog_str[i,HASH_VAL] + "<#CR>"
- i = i + 1
- WEND
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- timer_chatp = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatp
- FEND
- //討伐売りデータの整形
- PROCEDURE sellFormat()
- timer_sellf = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_chat_trd)
- Mutex.Lock(info_sell_trd)
- //チャット保持分のみにする
- cell_data = HASH_REMOVEALL
- //チャットデータから整形
- for i = 0 TO Length(chtlog_str) - 1
- // IFB info_sell_last < VAL("$" + chtlog_str[i,HASH_KEY])//最終処理分より後ろのみ処理
- srcstr = chtlog_str[i,HASH_VAL]
- sname = chtlog_src[i,HASH_VAL]
- tmpstr = srcstr
- numflg = false
- //小文字 カタカナ 半角に統一
- tmpstr = STRCONV(tmpstr,SC_LOWERCASE)
- tmpstr = STRCONV(tmpstr,SC_KATAKANA)
- tmpstr = STRCONV(tmpstr,SC_HALFWIDTH)
- tmpstr = regReplace(tmpstr,"([0-9]+)(p|g)|([0-9]+)",",$1$2$3,")
- //数値検出 3文字以上
- IF regTest(tmpstr,"[0-9]{3}") Then numflg = true
- //確認除去
- IF 0 <> POS("人",tmpstr,1) Then numflg = false
- IF 0 <> POS("名",tmpstr,1) Then numflg = false
- //数値有りのみ処理
- IFB numflg
- //数値有り
- //区切りっぽいものを統一
- tmpstr = REPLACE(tmpstr, " ", ",")
- tmpstr = REPLACE(tmpstr, "/", ",")
- tmpstr = REPLACE(tmpstr, "・", ",")
- //分割
- tmparry = SPLIT(tmpstr,",")
- //選別
- tmp_p = ""
- tmp_g = ""
- tmp_nan = ""
- for i = 0 TO Length(tmparry) - 1
- IFB 0 <> POS("p",tmparry[i],-1)
- tmp_p = tmparry[i]
- ELSEIF 0 <> POS("g",tmparry[i],-1)
- tmp_g = tmparry[i]
- ELSEIF ERR_VALUE <> VAL(tmparry[i]) AND 4 < LENGTH(tmparry[i])
- tmp_p = tmparry[i] + "p"
- ELSEIF ERR_VALUE <> VAL(tmparry[i]) AND 2 < LENGTH(tmparry[i])
- tmp_g = tmparry[i] + "g"
- ELSE
- tmp_nan = tmp_nan + tmparry[i] + " "
- ENDIF
- next
- //パディングして格納
- tmpstr = ""
- tmpget = VAL(COPY(tmp_p,1,lengthB(tmp_p)-1)) - VAL(COPY(tmp_g,1,lengthB(tmp_g)-1))
- tmpstr = tmpstr + format(" ",10 - lengthB(tmpget ) ) + tmpget + "get:"
- tmpstr = tmpstr + format(" ",10 - lengthB(tmp_p ) ) + tmp_p + ":"
- tmpstr = tmpstr + format(" ",10 - lengthB(tmp_g ) ) + tmp_g + ":"
- tmpstr = tmpstr + format(" ",40 - lengthB(tmp_nan) ) + tmp_nan + ":"
- tmpstr = tmpstr + sname + ":"
- tmpstr = tmpstr + srcstr
- //同一は纏める&ポイントとゴールドで並べる
- cell_data[tmpget + tmp_p + tmp_g + srcstr] = tmpstr
- ENDIF
- //最終処理通番更新
- info_sell_last = VAL("$" + chtlog_str[i,HASH_KEY])
- // ENDIF
- next
- //表示用
- // 1234567890get:1234567890:1234567890:1234567890123456789012345678901234567890:123456789012:
- info_sell_str = " 差額: ポイント: ゴールド: 未検知文字列: キャラ名:元文字列" + "<#CR>"
- for i = 0 TO Length(cell_data) - 1
- info_sell_str = info_sell_str + cell_data[i,HASH_VAL] + "<#CR>"
- next
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- Mutex.Unlock("info_sell_trd",info_sell_trd)
- timer_sellf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_sellf
- FEND
- //Statusメモリデータの取得整形
- FUNCTION GetStatusMemFormat()
- timer_stamf = GETTIME() * 1000 + G_TIME_ZZ
- DIM buff_dword[ArryDwordSize - 1]
- DIM buff_word[ArryWordSize - 1]
- DIM buff_cname[(6*3)+1]//6文字*MAX3byte + 終端
- //new(3.1.5b~)
- //staBA + $20F8 → 人数(n)
- //staBA + $20E0 + (n-1)*4byte → キャラステータス格納アドレス
- //charBA(n) + $60 → キャラクター名
- //charBA(n) + $84 → キャラクタID(サポは$00000000)
- //charBA(n) + $95 → 職種類
- //charBA(n) + $96 → LV
- //charBA(n) + $AC → HPmax
- //charBA(n) + $AE → MPmax
- //charBA(n) + $B0 → HPnow
- //charBA(n) + $B2 → MPnow
- //キャラクター数の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, staBA + $20F8 , buff_dword , 4, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- charMax = byte2dword(buff_dword)
- // Odbg("staCharMax :" + REPLACE(FORMAT(charMax,8,-1)," ","0") )
- //初期化
- sta_name = HASH_REMOVEALL
- sta_job = HASH_REMOVEALL
- sta_lv = HASH_REMOVEALL
- sta_hpmax = HASH_REMOVEALL
- sta_mpmax = HASH_REMOVEALL
- sta_hpnow = HASH_REMOVEALL
- sta_mpnow = HASH_REMOVEALL
- //人数分Statusの取得
- for i=0 TO charMax - 1
- //Status格納アドレスの取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, staBA + $20E0 + (i*4) , buff_dword , 4, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- charAddr = byte2dword(buff_dword)
- // Odbg("staChar(" + (i+1) + "/" + charMax + ")Addr:" + REPLACE(FORMAT(charAddr,8,-1)," ","0") )
- //キャラクター名の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $60 , buff_cname , 19, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_name[i] = byte2utf8( buff_cname )
- //キャラクターIDの取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $84 , buff_dword , 4, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_id[i] = byte2charid(buff_dword)
- sta_id[i] = COPY(sta_id[i],1,5) + "-" + COPY(sta_id[i],6)
- //職種類の取得
- buff_readcnt = 0
- buff_jobnum = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $95 , buff_jobnum , 1, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_job[i] = Job_name[buff_jobnum]
- //LVの取得
- buff_readcnt = 0
- buff_lvnum = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $96 , buff_lvnum , 1, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_lv[i] = buff_lvnum
- //HP最大値の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $AC , buff_word , 2, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_hpmax[i] = byte2word(buff_word)
- //MP最大値の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $AE , buff_word , 2, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_mpmax[i] = byte2word(buff_word)
- //HP現在値の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $B0 , buff_word , 2, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_hpnow[i] = byte2word(buff_word)
- //MP現在値の取得
- buff_readcnt = 0
- IFB false = ReadProcessMemory(DqxPhnd, charAddr + $B2 , buff_word , 2, buff_readcnt)
- Odbg("NG:ReadProcessMemory:staBaseCHK()" )
- RESULT = false
- Exit
- ENDIF
- sta_mpnow[i] = byte2word(buff_word)
- next
- timer_stamf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_stamf
- RESULT = true
- FEND
- //戦闘データの整形
- PROCEDURE battFormat()
- //ステータス情報の取得
- IFB GetStatusMemFormat()
- //取得OK
- ELSE
- //取得NG
- Exit
- ENDIF
- timer_battf = GETTIME() * 1000 + G_TIME_ZZ
- Mutex.Lock(info_slog_trd)
- Mutex.Lock(info_batt_trd)
- // batt_data = HASH_REMOVEALL
- //表示分のみ処理
- // info_slog_str = ""
- info_batt_str = ""
- i = 0
- WHILE i < Length(syslog_bflg)
- IFB syslog_bflg[i,HASH_VAL] = 0//処理した分は読まない
- tmpkey = syslog_bflg[i,HASH_KEY]
- syslog_bflg[tmpkey] = 1
- //比較用
- tmpstr = syslog_str[i,HASH_VAL]
- //戦闘開始 終了
- //[モンスター名]と 戦闘開始!
- //\s[キャラ名]\m[キャラID]\eが [モンスター名]たちと 戦闘開始!
- //\s[キャラ名]\m[キャラID]\eが 戦闘に参加した!
- //\s[キャラ名]\m[キャラID]\eは 戦うのをやめた。
- //\s[キャラ名]\m[キャラID]\eは [モンスター名]たちを やっつけた!
- IFB batt_sta_id = 0
- IFB 0 <> POS("戦闘開始!",tmpstr,-1) OR _
- ( 0 <> POS(sta_id[0,HASH_VAL],tmpstr,-1) AND 0 <> POS("戦闘に参加した!",tmpstr,-1) )
- batt_sta_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
- // batt_data = HASH_REMOVEALL
- //キャスト時間のリセット
- castm = HASH_REMOVEALL
- batt_end_id = 0
- i = i + 1
- Continue
- ENDIF
- ELSE
- IFB 0 <> POS("やっつけた!",tmpstr,-1) OR _
- 0 <> POS("いなくなった!",tmpstr,-1) OR _
- 0 <> POS("ぜんめつした。",tmpstr,-1) OR _
- ( 0 <> POS("戦いをやめた。",tmpstr,-1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,-1) )
- batt_end_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
- batt_sta_id = 0
- //キャスト時間のリセット
- castm = HASH_REMOVEALL
- //バフのリセット
- for i=0 TO length(buff2_name) - 1
- for j=0 TO 5 - 1
- buff2_rank[i][j] = 0
- next
- next
- for i=0 TO length(buff1a_stas) - 1
- for j=0 TO 5 - 1
- buff1a_rank[i][j] = 0
- next
- next
- for i=0 TO length(buff1b_stas) - 1
- for j=0 TO 5 - 1
- buff1b_rank[i][j] = 0
- next
- next
- i = i + 1
- Continue
- ENDIF
- ENDIF
- //未開始ログは読まない
- IFB batt_sta_id = 0
- i = i + 1
- Continue
- ENDIF
- batt_tmp_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
- //終了後ログは読まない
- IFB batt_end_id <> 0 AND batt_tmp_id > batt_end_id
- i = i + 1
- Continue
- ENDIF
- //バフのリセット
- // → \s[キャラ名]\m[キャラID]\eは しんでしまった。
- IFB 0 <> POS("しんでしまった。",tmpstr,-1)
- charNo = -1
- for tmpCharNo=0 TO length(sta_name) - 1
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- break //buffNoスキップ & 次のログへ
- ENDIF
- //リセット
- for i=0 TO length(buff2_name) - 1
- buff2_rank[i][charNo] = 0
- next
- for i=0 TO length(buff1a_stas) - 1
- buff1a_rank[i][charNo] = 0
- next
- for i=0 TO length(buff1b_stas) - 1
- buff1b_rank[i][charNo] = 0
- next
- i = i + 1
- Continue //次のログへ
- ENDIF
- //自前用キャストタイム 使用可チェック
- IFB 0 <> POS(" 使えるようになった!",tmpstr,-1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
- //★は むげんのさとりが 使えるようになった!
- //★は イオグランデが 使えるようになった!
- tmpCastName = BETWEENSTR(tmpstr,"は ","が 使えるようになった!")
- castm[tmpCastName] = 0
- i = i + 1
- Continue //次のログへ
- ENDIF
- //自前用キャストタイム 使用チェック
- for castNo=0 TO length(castm) - 1
- tmpCastName = castm[castNo,HASH_KEY]
- //通常
- IFB 0 <> POS(tmpCastName + "!",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
- //★の 真・やいばくだき!
- //★の 真・オノむそう!
- castm[tmpCastName] = GETTIME()
- //バフで再検知するのでスキップはしない
- //i = i + 1
- //Continue 2//次のログへ
- ENDIF
- //特殊
- IFB tmpCastName = "ジバルンバ" OR _
- tmpCastName = "超暴走魔法陣" OR _
- tmpCastName = "ドラゴンステップ" OR _
- tmpCastName = "ビーナスステップ" OR _
- tmpCastName = "ロイヤルステップ"
- IFB 0 <> POS(tmpCastName + "を",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
- //★は ドラゴンステップをおどった!
- //★は ビーナスステップをおどった!
- //★は 超暴走魔法陣を つくりだした!
- //★は ジバルンバを となえた!
- //★は ジバルンバを しかけた。
- castm[tmpCastName] = GETTIME()
- i = i + 1
- Continue 2//次のログへ
- ENDIF
- ENDIF
- IFB tmpCastName = "ためる参"
- IFB 0 <> POS("全身に ちからを ためた!",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
- //↓ためる123全て共通
- //★は 全身に ちからを ためた!
- castm[tmpCastName] = GETTIME()
- i = i + 1
- Continue 2//次のログへ
- ENDIF
- ENDIF
- next
- //2段階バフのチェック
- for buffNo=0 TO length(buff2_name) - 1
- //バフ名で検索
- //呪文耐性のみの別パターン
- IFB buff2_name[buffNo] = "呪文耐性"
- IFB 0 <> POS("もどった!",tmpstr,-1)
- IFB 0 <> POS("呪文の耐性",tmpstr,-1)
- charNo = 0
- for tmpCharNo=0 TO length(sta_name) - 1
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- buff2_rank[buffNo][charNo] = 0
- buff2_stat[buffNo][charNo] = GETTIME()
- //buffNoスキップ & 次のログへ
- break
- ENDIF
- ENDIF
- ENDIF
- IFB 0 <> POS(buff2_name[buffNo],tmpstr,1)
- //以下のどれか
- // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が 少し あがった!
- // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が かなり あがった!
- // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が 少し さがった!
- // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が かなり さがった!
- // → \s[キャラ名]\m[キャラID]\eの [バフ名称]アップの 効果延長!
- // → [サポ名]の [バフ名称]アップの 効果延長!
- //\s[キャラ名]\m[キャラID]\eの [バフ名称]が もとにもどった!
- // → \s[キャラ名]\m[キャラID]\eの コマンド間隔が かなり 短くなった!
- charNo = -1
- for tmpCharNo=0 TO length(sta_name) - 1
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- break //buffNoスキップ & 次のログへ
- ENDIF
- //段階チェック
- IFB buff2_name[buffNo] = "コマンド間隔" //特殊
- rank_upstr = "短くなった!"
- rank_dwstr = "長くなった!"
- ELSE
- rank_upstr = "あがった!"
- rank_dwstr = "さがった!"
- ENDIF
- IFB 0 <> POS(" 少し " + rank_upstr,tmpstr,-1)
- buff2_rank[buffNo][charNo] = buff2_rank[buffNo][charNo] + 1
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ELSEIF 0 <> POS(" 少し " + rank_dwstr,tmpstr,-1)
- buff2_rank[buffNo][charNo] = buff2_rank[buffNo][charNo] - 1
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ELSEIF 0 <> POS(" かなり " + rank_upstr,tmpstr,-1)
- buff2_rank[buffNo][charNo] = 2
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ELSEIF 0 <> POS(" かなり " + rank_dwstr,tmpstr,-1)
- buff2_rank[buffNo][charNo] = -2
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ELSEIF 0 <> POS("もどった!",tmpstr,-1)
- buff2_rank[buffNo][charNo] = 0
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ELSEIF 0 <> POS("効果延長!",tmpstr,-1)
- buff2_stat[buffNo][charNo] = GETTIME()
- break //buffNoスキップ & 次のログへ
- ENDIF
- ENDIF
- next
- //1段階バフAタイプのチェック
- for buffNo=0 TO length(buff1a_stas) - 1
- //buff1a_stas[] 効果発生時文字列
- //buff1a_ends[] 効果終了時文字列
- //buff1a_exts[] 効果延長時文字列
- buff1rank = ""
- IFB 0 <> POS(buff1a_stas[buffNo],tmpstr,1)
- buff1rank = 1
- ELSEIF 0 <> POS(buff1a_ends[buffNo],tmpstr,1)
- buff1rank = 0
- ELSEIF 0 <> POS(buff1a_exts[buffNo],tmpstr,1)
- buff1rank = 1
- ENDIF
- IFB buff1rank <> ""
- //1段階バフの場合
- charNo = -1
- for tmpCharNo=0 TO length(sta_name)
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- break //buffNoスキップ & 次のログへ
- ENDIF
- buff1a_rank[buffNo][charNo] = buff1rank
- buff1a_stat[buffNo][charNo] = GETTIME()
- //buffNoスキップ & 次のログへ
- break
- ENDIF
- next
- //1段階バフBタイプのチェック
- for buffNo=0 TO length(buff1b_stas) - 1
- //buff1b_stas[] 効果発生時文字列
- //buff1b_ends[] 効果終了時文字列
- buff1rank = ""
- IFB 0 <> POS(buff1b_stas[buffNo],tmpstr,1)
- buff1rank = 1
- ELSEIF 0 <> POS(buff1b_ends[buffNo],tmpstr,1)
- buff1rank = 0
- ENDIF
- IFB buff1rank <> ""
- //1段階バフの場合
- charNo = -1
- for tmpCharNo=0 TO length(sta_name)
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- break //buffNoスキップ & 次のログへ
- ENDIF
- buff1b_rank[buffNo][charNo] = buff1rank
- buff1b_stat[buffNo][charNo] = GETTIME()
- //buffNoスキップ & 次のログへ
- break
- ENDIF
- next
- //1段階バフCタイプのチェック
- //★の 早詠みの杖!
- //★の 早詠みの杖の効果が きえた!
- IFB 0 <> POS("の 早詠みの杖",tmpstr,-1)
- charNo = -1
- for tmpCharNo=0 TO length(sta_name)
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- i = i + 1
- Continue //次のログへ
- ENDIF
- IFB 0 <> POS("きえた!",tmpstr,-1)
- buff1c_rank[0][charNo] = 0
- ELSE
- buff1c_rank[0][charNo] = 1
- buff1c_stat[0][charNo] = GETTIME()
- ENDIF
- ENDIF
- //★の ラピッドステッキ!
- // → ★は すばやく 呪文を となえられる!
- //★の ラピッドステッキの効果が きえた!
- IFB 0 <> POS("ラピッドステッキ",tmpstr,-1)
- charNo = -1
- for tmpCharNo=0 TO length(sta_name)
- //IDで検索 優先
- IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- //名前で検索 サポ名が同じ場合はかぶる
- IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
- charNo = tmpCharNo
- Break
- ENDIF
- next
- IFB charNo = -1
- //仲間キャラ以外(モンスターのログ)
- i = i + 1
- Continue //次のログへ
- ENDIF
- IFB 0 <> POS("ラピッドステッキ!",tmpstr,-1)
- buff1c_rank[1][charNo] = 1
- buff1c_stat[1][charNo] = GETTIME()
- ELSEIF 0 <> POS("ラピッドステッキの効果",tmpstr,-1)
- buff1c_rank[1][charNo] = 0
- ENDIF
- ENDIF
- ENDIF
- i = i + 1
- Wend
- info_batt_str = info_batt_str + "開始:" + format(batt_sta_id,8,-1)
- info_batt_str = info_batt_str + " 終了:" + format(batt_end_id,8,-1) + "<#CR>"
- //ステータスの表示
- // for i = 0 TO Length(sta_name) - 1 //取得順
- // for i = Length(sta_name) - 1 TO 0 STEP -1 //逆順(表示と同じ)
- // info_batt_str = info_batt_str + format(" ",12 - lengthB(sta_name[i,HASH_VAL])) + sta_name[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + format(" ", 9 - lengthB(sta_id[i,HASH_VAL])) + sta_id[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_job[i,HASH_VAL])) + sta_job[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + format(" ", 2 - lengthB(sta_lv[i,HASH_VAL])) + sta_lv[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_hpnow[i,HASH_VAL])) + sta_hpnow[i,HASH_VAL] + "/"
- // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_hpmax[i,HASH_VAL])) + sta_hpmax[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_mpnow[i,HASH_VAL])) + sta_mpnow[i,HASH_VAL] + "/"
- // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_mpmax[i,HASH_VAL])) + sta_mpmax[i,HASH_VAL] + ":"
- // info_batt_str = info_batt_str + "<#CR>"
- // next
- //キャスト技の表示
- for castNo=0 TO length(castm) - 1
- tmpCastName = castm[castNo,HASH_KEY]
- maxCastTime = castTimeMax[tmpCastName]
- remain = maxCastTime - ( GETTIME() - castm[castNo,HASH_VAL] )
- IFB remain > 0
- remain = format(remain / (maxCastTime / progres_num) ,5,0)
- progres = format(progres_ful, remain) + format(progres_emp, progres_num - remain)
- info_batt_str = info_batt_str + tmpCastName + ":" + progres + "<#CR>"
- ELSE
- info_batt_str = info_batt_str + tmpCastName + ":" + "OK" + "<#CR>"
- ENDIF
- next
- //バフ表示
- // :攻:守:早:
- // キャラ名: 1: 2: 0:
- info_batt_str = info_batt_str + format(" ",12) + ":"
- //2段階バフ表示名
- for buffNo=0 TO length(buff2_sname) - 1
- info_batt_str = info_batt_str + buff2_sname[buffNo] + ":"
- next
- //1段階バフ表示名Aタイプ
- for buffNo=0 TO length(buff1a_sname) - 1
- info_batt_str = info_batt_str + buff1a_sname[buffNo] + ":"
- next
- //1段階バフ表示名Bタイプ
- for buffNo=0 TO length(buff1b_sname) - 1
- info_batt_str = info_batt_str + buff1b_sname[buffNo] + ":"
- next
- //1段階バフ表示名Cタイプ
- for buffNo=0 TO length(buff1c_sname) - 1
- info_batt_str = info_batt_str + buff1c_sname[buffNo] + ":"
- next
- info_batt_str = info_batt_str + "<#CR>"
- for tmpCharNo = Length(sta_name) - 1 TO 0 STEP -1
- info_batt_str = info_batt_str + format(" ",12 - lengthB(sta_name[tmpCharNo,HASH_VAL])) + sta_name[tmpCharNo,HASH_VAL] + ":"
- //2段階バフ表示
- for buffNo=0 TO length(buff2_name) - 1
- tmpRank = buff2_rank[buffNo][tmpCharNo]
- IF tmpRank = "" Then tmpRank = 0
- IFB tmpRank < 0
- //マイナス時は警告無し
- time_warn = ""
- ELSE
- //残り時間警告
- IFB tmpRank <> 0 AND ( buff2_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff2_stat[buffNo][tmpCharNo] )
- time_warn = time_warn_char
- ELSE
- time_warn = " "
- ENDIF
- IF tmpRank = 0 Then tmpRank = " "
- ENDIF
- info_batt_str = info_batt_str + time_warn + tmpRank + ":"
- next
- //1段階バフ表示Aタイプ
- for buffNo=0 TO length(buff1a_stas) - 1
- tmpRank = buff1a_rank[buffNo][tmpCharNo]
- IF tmpRank = "" Then tmpRank = 0
- IFB tmpRank < 0
- //マイナス時は警告無し
- time_warn = ""
- ELSE
- //残り時間警告
- IFB tmpRank <> 0 AND ( buff1a_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1a_stat[buffNo][tmpCharNo] )
- time_warn = time_warn_char
- ELSE
- time_warn = " "
- ENDIF
- IF tmpRank = 0 Then tmpRank = " "
- ENDIF
- info_batt_str = info_batt_str + time_warn + tmpRank + ":"
- next
- //1段階バフ表示Bタイプ
- for buffNo=0 TO length(buff1b_stas) - 1
- tmpRank = buff1b_rank[buffNo][tmpCharNo]
- IF tmpRank = "" Then tmpRank = 0
- IFB tmpRank < 0
- //マイナス時は警告無し
- time_warn = ""
- ELSE
- //残り時間警告
- IFB tmpRank <> 0 AND ( buff1b_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1b_stat[buffNo][tmpCharNo] )
- time_warn = time_warn_char
- ELSE
- time_warn = " "
- ENDIF
- IF tmpRank = 0 Then tmpRank = " "
- ENDIF
- info_batt_str = info_batt_str + time_warn + tmpRank + ":"
- next
- //1段階バフ表示Cタイプ
- for buffNo=0 TO length(buff1c_sname) - 1
- tmpRank = buff1c_rank[buffNo][tmpCharNo]
- IF tmpRank = "" Then tmpRank = 0
- IFB tmpRank < 0
- //マイナス時は警告無し
- time_warn = ""
- ELSE
- //残り時間警告
- IFB tmpRank <> 0 AND ( buff1c_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1c_stat[buffNo][tmpCharNo] )
- time_warn = time_warn_char
- ELSE
- time_warn = " "
- ENDIF
- IF tmpRank = 0 Then tmpRank = " "
- ENDIF
- info_batt_str = info_batt_str + time_warn + tmpRank + ":"
- next
- info_batt_str = info_batt_str + "<#CR>"
- next
- Mutex.Unlock("info_batt_trd",info_batt_trd)
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- timer_battf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_battf
- FEND
- //ログファイル出力(スレッド処理)
- PROCEDURE TRD_log_output()
- WHILE true
- timer_fwrite = GETTIME() * 1000 + G_TIME_ZZ
- //システムログ
- //最終行のメッセージIDを取得
- fid_slog = FOPEN(slogpath, F_READ)
- eol = FGET(fid_slog, F_LINECOUNT )
- oldSLogId = VAL( "$" + COPY(FGET(fid_slog, eol),1,8) )
- FCLOSE(fid_slog)
- Mutex.Lock(info_slog_trd)
- lastnum = length(syslog_wflg) - 1 //syslog_wflgが最後に処理されるので
- outstr = ""
- for i = 0 TO lastnum
- IFB syslog_wflg[i,HASH_VAL] = 0 //未書込
- tmpkey = syslog_wflg[i,HASH_KEY]
- outstr = outstr + syslog_wflg[i,HASH_KEY] + "," + _
- syslog_time[i,HASH_VAL] + "," + _
- syslog_type[i,HASH_VAL] + "," + _
- syslog_str[i,HASH_VAL] + "<#CR>"
- syslog_wflg[tmpkey] = 1//書込完了
- Sleep(0.1)
- ENDIF
- next
- //まとめて書込
- IFB outstr <> ""
- outstr = TRIM(outstr)
- outstr = TRIM(outstr)
- fid_slog = FOPEN(slogpath, F_READ or F_WRITE)
- FPUT(fid_slog, outstr)
- FCLOSE(fid_slog)
- ENDIF
- Mutex.Unlock("info_slog_trd",info_slog_trd)
- //チャットログ
- //最終行のメッセージIDを取得
- fid_chat = FOPEN(clogpath, F_READ)
- eol = FGET(fid_chat, F_LINECOUNT )
- oldSLogId = VAL( "$" + COPY(FGET(fid_chat, eol),1,8) )
- FCLOSE(fid_chat)
- Mutex.Lock(info_chat_trd)
- lastnum = length(chtlog_wflg) - 1 //chtlog_wflgが最後に処理されるので
- outstr = ""
- for i = 0 TO lastnum
- IFB chtlog_wflg[i,HASH_VAL] = 0 //未書込
- tmpkey = chtlog_wflg[i,HASH_KEY]
- outstr = outstr + chtlog_wflg[i,HASH_KEY] + "," + _
- chtlog_srcid[i,HASH_VAL] + "," + _
- chtlog_desid[i,HASH_VAL] + "," + _
- chtlog_tmp[i,HASH_VAL] + "," + _
- chtlog_room[i,HASH_VAL] + "," + _
- chtlog_src[i,HASH_VAL] + "," + _
- chtlog_des[i,HASH_VAL] + "," + _
- chtlog_str[i,HASH_VAL] + "<#CR>"
- chtlog_wflg[tmpkey] = 1//書込完了
- Sleep(0.1)
- ENDIF
- next
- //まとめて書込
- IFB outstr <> ""
- outstr = TRIM(outstr)
- fid_chat = FOPEN(clogpath, F_READ or F_WRITE)
- FPUT(fid_chat, outstr)
- FCLOSE(fid_chat)
- ENDIF
- Mutex.Unlock("info_chat_trd",info_chat_trd)
- timer_fwrite = (GETTIME() * 1000 + G_TIME_ZZ) - timer_fwrite
- //ファイル書き込みインターバル
- timer_fwrite_old = VAL(format( (fwiv - timer_fwrite) / 1000 ,5,3))
- IFB timer_fwrite_old > 0
- Sleep(timer_fwrite_old)
- Else
- //時間超過
- Sleep(0.001)
- ENDIF
- Wend
- FEND
- //BYTE値をDQX内キャラクターIDへ変換
- FUNCTION byte2charid(byte_array[])
- IFB 4 = LENGTH(byte_array)
- tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 ) + (byte_array[2] * $10000 ) + (byte_array[3] * $1000000)
- tmpnum = FORMAT(tmpnum,9)
- tmpnum = REPLACE(tmpnum," ","0")
- tmphead = COPY(tmpnum,1,3)
- tmpC = COPY(tmpnum,4)
- tmpA = tmphead / 26
- tmpA = CHRB(tmpA+65)
- tmpB = tmphead MOD 26
- tmpB = CHRB(tmpB+65)
- RESULT = tmpA + tmpB + tmpC
- Exit
- ELSE
- MSGBOX("byte2dword :配列数エラー:" + LENGTH(byte_array))
- ExitExit
- ENDIF
- Exit
- FEND
- //戦闘関連の表示
- PROCEDURE fight_info()
- infohead = infohead + "戦闘状態:" + fight_flg + "<#CR>"
- infohead = infohead + "戦闘開始:" + fight_sta + "<#CR>"
- IFB fight_flg = 0
- infohead = infohead + "前回時間:" + fight_time + "<#CR>"
- ELSE
- fight_time = (GETTIME() - fight_sta)
- infohead = infohead + "戦闘時間:" + fight_time + "<#CR>"
- ENDIF
- infohead = infohead + "食らいダメージ<#CR>"
- for i = 0 TO LENGTH(fight_char) - 1
- tmpcha = fight_char[i,HASH_KEY]
- tmpnum = fight_char[i,HASH_VAL]
- infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
- next
- for i = 0 TO LENGTH(fight_mons) - 1
- tmpcha = fight_mons[i,HASH_KEY]
- tmpnum = fight_mons[i,HASH_VAL]
- infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
- next
- infohead = infohead + "与えたダメージ<#CR>"
- for i = 0 TO LENGTH(fight_charAtk) - 1
- tmpcha = fight_charAtk[i,HASH_KEY]
- tmpnum = fight_charAtk[i,HASH_VAL]
- IF fight_time = 0 THEN fight_time = 1//0除算防止
- infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + _
- " DPS:" + FORMAT((tmpnum / fight_time),1,1) + "<#CR>"
- next
- for i = 0 TO LENGTH(fight_monsAtk) - 1
- tmpcha = fight_monsAtk[i,HASH_KEY]
- tmpnum = fight_monsAtk[i,HASH_VAL]
- infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
- next
- FEND
- PROCEDURE slogCHK(slogStr)
- FEND
- //正規表現置換
- Function regReplace(str, ptn, rep)
- Dim reg = CreateOLEObj("VBScript.Regexp")
- reg.Global = true
- reg.Multiline = true
- reg.IgnoreCase = true
- reg.pattern = ptn
- Result = reg.Replace(str,rep)
- FEND
- Function regTest(str, ptn)
- Dim reg = CreateOLEObj("VBScript.Regexp")
- reg.Global = true
- reg.Multiline = true
- reg.IgnoreCase = true
- reg.pattern = ptn
- IFB reg.Test(str) = 0
- Result = false
- ELSE
- Result = true
- ENDIF
- FEnd
- //Mutexで排他制御
- //
- //handleA = Mutex.Init(name)
- //Mutex.Lock(handleA)
- //Mutex.Unlock(name,handleA)
- //Mutex.Release(name,handleA)
- MODULE Mutex
- CONST _wait = 0.001
- DEF_DLL CloseHandle(dword): bool: kernel32.dll
- DEF_DLL GetLastError(): dword: kernel32.dll
- DEF_DLL WaitForSingleObject(dword, dword): dword: kernel32.dll
- // Mutex用
- DEF_DLL CreateMutexA(dword, bool, string): dword: kernel32.dll
- DEF_DLL ReleaseMutex(dword): bool: kernel32.dll
- FUNCTION Init(name)
- ret = CreateMutexA(NULL, FALSE, NULL)
- IFB ret = NULL
- print "InitMutex CreateMutexA Error:" + name + ":" + GetLastError()
- MSGBOX("InitMutex CreateMutexA Error:" + name + ":" + GetLastError())
- ExitExit
- ENDIF
- RESULT = ret
- FEND
- FUNCTION Lock(handle)
- RESULT = TRUE
- WHILE !TryLock(handle)
- SLEEP(_wait)
- WEND
- FEND
- FUNCTION TryLock(handle)
- RESULT = FALSE
- DIM ret = WaitForSingleObject(handle, 0)
- IF ret = 0 Then RESULT = TRUE
- FEND
- PROCEDURE Unlock(name,handle)
- IFB !ReleaseMutex(handle)
- print "UnlockMutex ReleaseMutex Error:" + name + ":" + GetLastError()
- MSGBOX("UnlockMutex ReleaseMutex Error:" + name + ":" + GetLastError())
- ExitExit
- ENDIF
- FEND
- PROCEDURE Release(name,handle)
- IFB !CloseHandle(handle)
- print "CloseMutex CloseHandle Error:" + name + ":" + GetLastError()
- MSGBOX("CloseMutex CloseHandle Error:" + name + ":" + GetLastError())
- ExitExit
- ENDIF
- FEND
- ENDMODULE
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //覚書
- //
- //BaseAddr検索
- //AVbad_exception@std@@
- //で検索して0x500ほど+
- //00が消えたところがBase?
- //
- //011ADA26-011ADA3A: 15h(21)Byte [UTF-8]
- //Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
- //011ADA26 : 41 56 62 61 64 5F 65 78 63 65 70 74 69 6F 6E 40 AVbad_exception@
- //011ADA36 : 73 74 64 40 40 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? std@@
- //
- //
- //**log の格納(予想)**
- //*チャットログ*
- //DQXBaseAddr + logPO → logBA
- //logBA + logDOchat → チャットログ基点アドレス
- //
- //発言元キャラと発言先キャラが 指定無しの白チャは発言先なし
- //元キャラID 先キャラID Chat通番 何か? ルーム番号? 元キャラ名 先キャラ名 Chat上段 下段
- //4byte 4 4 4 4 19 19 61 61
- //
- //Chat上下段はUTF-8なので一文字MAX6byte
- //上下段が全角10文字 = 60 + 終端
- //
- //キャラ名はUTF-8だが制限で一文字MAX3byte?
- //キャラ名が全角6文字 = 18 + 終端
- //発言先キャラ名が全角6文字 = 18 + 終端
- //
- //180byteでChat発言1個
- //Chatが180個分連続した後の4byte180がおそらく表示順に格納アドレス
- //
- //チャット用最大バッファサイズ
- //(180 * 180) + (4 * 180)
- //
- //*システムログ*
- //DQXBaseAddr + logPO → logBA
- //logBA + logDOsytm → システムログ基点アドレス
- //
- //システムログ基点アドレス 2個前の 4byte システムログの開始アドレスオフセット logSystmSta
- //システムログ基点アドレス 1個前の 4byte システムログの終了アドレスオフセット logSystmEnd
- //ログは一定量でループするので 基点アドレス から 基点アドレス+$609B が書き換わる
- //
- //(logSystmStaが0ではない場合)
- //基点アドレス+logSystmSta ~ 基点アドレス+$609B(終端)
- //と
- //基点アドレス ~ 基点アドレス+logSystmEnd
- //を結合
- //
- //メッセージ通番 種類 長さ メッセージ
- //4byte 1 1 不定
- //
- //種類
- // 1:ダメージ 4:回復 5:通常 6:戦闘後
- //18:時刻 19:郵便Item 20:郵便G 24:ドラキー
- //
- //(例)
- //logBA+logDOsytm→$160B0270(基点)
- //$160B0270+$609B→$160B630B(終点)
- //Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
- //160B6290 : E3 83 A1 E3 83 BC E3 82 B8 EF BC 81 00 A2 E3 83 メ ー ジ !
- //160B62A0 : 15 03 00 00 00 3C 20 E2 86 92 20 E3 82 AD E3 83 < → キ ラ
- //160B62B0 : A9 E3 83 BC E3 82 B8 E3 83 A3 E3 83 83 E3 82 AF ー ジ ャ ッ ク
- //160B62C0 : E3 81 AB 20 34 39 E3 81 AE E3 83 80 E3 83 A1 E3 に 49の ダ メ ー
- //160B62D0 : 83 BC E3 82 B8 EF BC 81 00 81 00 00 16 03 00 00 ジ !
- //160B62E0 : 05 2C E3 82 A2 E3 83 B3 E3 83 AB E3 82 B7 E3 82 ,ア ン ル シ ア
- //160B62F0 : A2 E3 81 AE 20 E3 81 93 E3 81 86 E3 81 92 E3 81 の こ う げ き
- //160B6300 : 8D EF BC 81 00 00 00 00 00 00 00 00 15 00 00 00 !
- //160B6310 : 00 00 00 00 3E 01 00 00 00 00 12 50 00 00 00 00 > P
- //最終メッセージ
- //160B62DCから開始
- //160B62DC→$00000316(通番)
- //160B62E0→$05(type)
- //160B62E1→$2C(文字長)
- //160B62DC+$2C→160B6308(終端)
- //
- //
- //**Statusの格納(予想)**
- //**
- //DQXBaseAddr + staPO → staBA
- //
- //old
- //staBA + $2988 → 人数(n)
- //staBA + $2970 + (n-1)*4byte → キャラステータス格納アドレス
- //charBA(n) + $E8 → キャラクター名
- //charBA(n) + $10C → キャラクタID(サポは$00000000)
- //charBA(n) + $121 → 職種類
- //charBA(n) + $122 → LV
- //charBA(n) + $124 → HPmax
- //charBA(n) + $126 → MPmax
- //charBA(n) + $13C → HPnow
- //charBA(n) + $13E → MPnow
- //
- //new(3.1.5b~)
- //staBA + $20F8 → 人数(n)
- //staBA + $20E0 + (n-1)*4byte → キャラステータス格納アドレス
- //charBA(n) + $60 → キャラクター名
- //charBA(n) + $84 → キャラクタID(サポは$00000000)
- //charBA(n) + $95 → 職種類
- //charBA(n) + $96 → LV
- //charBA(n) + $AC → HPmax
- //charBA(n) + $AE → MPmax
- //charBA(n) + $B0 → HPnow
- //charBA(n) + $B2 → MPnow
- //
- //職業
- //02:戦士 06:盗賊 0A:魔法戦士 0E:まもの使い
- //03:僧侶 07:旅芸人 0B:レンジャー 0F:どうぐ使い
- //04:魔法使い 08:バトルマスター 0C:賢者 10:踊り子
- //05:武闘家 09:パラディン 0D:スーパースター
- //2文字版 02:戦士 03:僧侶 04:魔法 05:武闘 06:盗賊 07:旅芸 08:バト 09:パラ 0A:魔戦 0B:レン 0C:賢者 0D:スパ 0E:まも 0F:どう 10:踊り
- //1文字版 02:戦 03:僧 04:魔 05:武 06:盗 07:旅 08:バ 09:パ 0A:電 0B:レ 0C:賢 0D:ス 0E:ま 0F:ど 10:踊
- //
- //
- //
- //
- //
- ///////////////////////////////////////////////////////////////////////////////////////////////
- // バフ一覧
- //【スカラ】【スクルト】
- //【バイシオン】【バイキルト】【すてみ】
- //【妖精たちのポルカ】(味方全体にスカラ+バイシオン+リホ+MP回復効果)
- //【ピオラ】?【ピオリム】
- //【ズッシード】
- //【リホイミ】【リベホイミ】【リベホイム】【いやしの雨】?【明鏡止水】
- //【バーハ】【フバーハ】【心頭滅却】
- //【マホターン】
- //【マホキテ】
- //【マホステ】
- //【マホカンタ】
- //【魔結界】
- //【魔力の息吹】
- //【魔力かくせい】
- //【ためる】【ためる弐】【テンションブースト】【一喝】(【ボケ】)(【とうこん撃ち】?)
- //【早詠みの杖】
- //【ビッグシールド】?
- //【まもりのたて】
- //【会心完全ガード】
- //【マホトラのころも】
- //【聖女の守り】
- //【天使の守り】
- //【聖なる祈り】
- //【しんぴのさとり】
- //【マジステッキ】
- //【キラキラポーン】
- //【タップダンス】
- //【ファイアフォース】【アイスフォース】【ダークフォース】【ライトフォース】
- //【メイクアップ】
- //【パラディンガード】
- //【アクロバットスター】
- //【モンスターゾーン】
- //2文字でまとめ
- //攻↑ スク フバ 魔結 速度 魔↑ 回↑
- //聖女 女神 天使 盾↑ 守盾 会心
- //魔捨 魔衣 ポン 魔反 魔転
- //reHP reMP
- //炎↑ 氷↑ 風↑ 闇↑ 光↑
- //重↑ 魅↑ 避↑
- //早詠 ラピ
- //テン
- //1文字
- //攻 ス フ 結 速 魔 回 聖 女 天 盾 守 会 捨 衣 ポ 反 転 rH rM 炎 氷 風 闇 光 重 魅 避 詠 ラ テ
- //戦闘時ログ
- //↓ここからコメント扱い
- TextBlock CommentDAYOOO
- 実キャラ ★:\s[キャラ名]\m[キャラID]\e
- サポート ★:[キャラ名]
- まじんで変化した場合は[キャラ名]のみ変わる
- \sムッチーノ\m[キャラID]\eの たたかいのうた!
- 時間で消えた場合は → は無し
- [いてつくはどう]やデバフ魔法などは → がつく
- ***まとめ***
- → ★の こうげき力が 少し あがった!
- → ★の こうげき力が かなり あがった!
- → ★の こうげき力が もとにもどった!
- → ★の こうげき力アップの 効果延長!
- ★の こうげき力が もとにもどった!
- → ★の しゅび力が 少し あがった!
- → ★の しゅび力が かなり あがった!
- → ★の しゅび力が もとにもどった!
- → ★の しゅび力アップの 効果延長!
- → ★の しゅび力が もとにもどった!
- ★の しゅび力が もとにもどった!
- → ★の ブレス耐性が もとにもどった!
- → ★の ブレス耐性が かなり あがった!
- → ★の ブレス耐性が 少し あがった!
- → ★の ブレス耐性アップの 効果延長!
- ★の ブレス耐性が もとにもどった!
- → ★の 呪文の耐性が もとにもどった!
- → ★の 呪文耐性が かなり あがった!
- → ★の 呪文耐性が かなり さがった!
- → ★の 呪文耐性が 少し あがった!
- → ★の 呪文耐性が 少し さがった!
- → ★の 呪文耐性アップの 効果延長!
- → ★の 呪文耐性ダウンの 効果延長!
- ★の 呪文の耐性が もとにもどった!
- → ★の コマンド間隔が かなり 短くなった!
- → ★の コマンド間隔が かなり 長くなった!
- → ★の コマンド間隔が もとにもどった!
- → ★の コマンド間隔が 少し 短くなった!
- → ★の コマンド間隔が 少し 長くなった!
- → ★の コマンド間隔延長の 効果延長!
- → ★の コマンド間隔短縮の 効果延長!
- → ★の コマンド間隔が もとにもどった!
- ★の コマンド間隔が もとにもどった!
- ★の コマンド間隔が 少し 短くなった!
- → ★の 呪文の威力が かなり あがった!
- → ★の 呪文の威力が もとにもどった!
- → ★の 呪文の威力が 少し さがった!
- → ★の 呪文の威力が もとにもどった!
- ★の 呪文の威力が もとにもどった!
- → ★の 呪文の回復力が かなり あがった!
- → ★の 呪文の回復力が もとにもどった!
- → ★の 呪文の回復量増加の 効果延長!
- → ★の 重さが ふえた!
- ★の 呪文の回復力が もとにもどった!
- → ★の 重さが ふえた!
- → ★の 重さが もとにもどった!
- → ★の 重さアップの 効果延長!
- ★の 重さが ふえた!
- ★の 重さが もとにもどった!
- → ★は 聖女の守りを 受けた!
- → ★の 聖女の守りが きえた。
- ★の 聖女の守りが きえた。
- → ★の 天使の守りが きえた。
- → ★の 女神の祝福が きえた。
- ★の 会心ガード!
- ★の 会心ガードが きえた。
- → ★は 盾で ガードしやすくなった!
- ★の 盾ガード率が もとにもどった!
- → ★に 呪文をかきけす マホステ効果!
- ★の マホステが きえた。
- → ★は 悪い効果に かかりにくくなった!
- ★の キラキラポーンが きえた。
- → ★の みりょくが あがった!
- ★の みりょくが もとにもどった!
- → ★は マホトラのころもを 身にまとった!
- → ★の マホトラのころもが きえた!
- ★の マホトラのころもが きえた!
- → ★の ストームフォースが とけた!
- ★は むげんのさとりが 使えるようになった!
- ★は イオグランデが 使えるようになった!
- ★は スタンショットが 使えるようになった!
- ★は スペルガードが 使えるようになった!
- ★は ティンクルバトンが 使えるようになった!
- ★は テンションバーンが 使えるようになった!
- ★は ドルマドンが 使えるようになった!
- ★は ファランクスが 使えるようになった!
- ★は プレートインパクトが 使えるようになった!
- ★は ホーリーライトが 使えるようになった!
- ★は ミラクルブーストが 使えるようになった!
- ★は ラピッドステッキが 使えるようになった!
- ★は 女神の祝福が 使えるようになった!
- ★は 復活の杖が 使えるようになった!
- ★は 超暴走魔法陣が 使えるようになった!
- ***元ログ***
- → ★に 104のダメージ!
- → ★に 呪文をかきけす マホステ効果!
- → ★には きかなかった!
- → ★には 何も おこらなかった!
- → ★には 効果がなかった!
- → ★の かいしんの いちげき!
- → ★の からだから どくが きえた!
- → ★の こうげき力が かなり あがった!
- → ★の こうげき力が もとにもどった!
- → ★の こうげき力が 少し あがった!
- → ★の こうげき力が 少し さがった!
- → ★の こうげき力アップの 効果延長!
- → ★の しゅび力が かなり あがった!
- → ★の しゅび力が かなり さがった!
- → ★の しゅび力が もとにもどった!
- → ★の しゅび力が 少し あがった!
- → ★の しゅび力が 少し さがった!
- → ★の しゅび力アップの 効果延長!
- → ★の しゅび力ダウンの 効果延長!
- → ★の どうぐの効果が もとにもどった!
- → ★の どうぐ効果範囲が もとにもどった!
- → ★の みりょくが あがった!
- → ★の みりょくアップの 効果延長!
- → ★の アタマは こんらんした!
- → ★の カウンター!
- → ★の キラキラポーンが きえた。
- → ★の キラキラ効果が 悪い効果を はらいのけた!
- → ★の コマンド間隔が かなり 短くなった!
- → ★の コマンド間隔が かなり 長くなった!
- → ★の コマンド間隔が もとにもどった!
- → ★の コマンド間隔が 少し 短くなった!
- → ★の コマンド間隔が 少し 長くなった!
- → ★の コマンド間隔延長の 効果延長!
- → ★の コマンド間隔短縮の 効果延長!
- → ★の シビれが きえた!
- → ★の チャージ時間が もとにもどった!
- → ★の テンションが 100あがった!
- → ★の テンションが 20あがった!
- → ★の テンションが 50あがった!
- → ★の テンションが 5あがった!
- → ★の テンションが もとにもどった。
- → ★の テンションは あがらなかった!
- → ★の ブレス耐性が かなり あがった!
- → ★の ブレス耐性が 少し あがった!
- → ★の ブレス耐性アップの 効果延長!
- → ★の ラピッドステッキの効果が きえた!
- → ★の リベホイムのHP回復が おわった!
- → ★の 会心と呪文ぼうそう率が あがった!
- → ★の 会心と呪文ぼうそう率が もとにもどった。
- → ★の 会心ガードが きえた。
- → ★の 会心完全ガード!
- → ★の 呪いが とけた!
- → ★の 呪文の回復力が かなり あがった!
- → ★の 呪文の回復力が もとにもどった!
- → ★の 呪文の回復量増加の 効果延長!
- → ★の 呪文の威力が かなり あがった!
- → ★の 呪文の威力が もとにもどった!
- → ★の 呪文の威力が 少し さがった!
- → ★の 呪文の耐性が もとにもどった!
- → ★の 呪文耐性が かなり あがった!
- → ★の 呪文耐性が かなり さがった!
- → ★の 呪文耐性が 少し あがった!
- → ★の 呪文耐性が 少し さがった!
- → ★の 呪文耐性アップの 効果延長!
- → ★の 呪文耐性ダウンの 効果延長!
- → ★の 天使の守りが きえた。
- → ★の 姿が もとにもどった!
- → ★の 幻惑が とけた!
- → ★の 攻撃時 HP回復が きえた!
- → ★の 盾ガード率が もとにもどった!
- → ★の 聖女の守りが きえた。
- → ★の 重さが ふえた!
- → ★の 重さが もとにもどった!
- → ★の 重さアップの 効果延長!
- → ★の HPが 100回復した!
- → ★の MPが 0回復した!
- → ★の MPを 0うばった!
- → ★の最大HPが ふえた!
- → ★の最大MPが ふえた!
- → ★は 100のダメージを うけた!
- → ★は うけるダメージと 与えるダメージが 少なくなった。
- → ★は からだが シビれた!
- → ★は こうげきを かわしやすくなった!
- → ★は さらに まぼろしに つつまれた!
- → ★は しんでしまった。
- → ★は すっころんだ!
- → ★は すばやく 呪文を となえられる!
- → ★は とりはだが たってしまった!
- → ★は どうぐの効果が 倍になった!
- → ★は どうぐの効果が 範囲になった!
- → ★は ねむってしまった!
- → ★は ひらりと 身をかわした!
- → ★は ふっとばされた!
- → ★は まぼろしに つつまれた!
- → ★は もうどくに おかされた!
- → ★は もらえる経験値が ふえた!
- → ★は やいばのぼうぎょで 身を守った。
- → ★は われにかえった!
- → ★は ターン消費しなかった!
- → ★は テンションが さがらなかった!
- → ★は マホトラのころもを 身にまとった!
- → ★は ムッチーノに変化した!
- → ★は 仲間モンスターとの 絆を感じた!
- → ★は 会心攻撃で うけるダメージが少なくなった。
- → ★は 呪いを ふりはらった!
- → ★は 呪われてしまった!
- → ★は 天使の守りを 受けた!
- → ★は 女神の祝福を 受けた!
- → ★は 小さくなってしまった!
- → ★は 少しずつ HPが回復する!
- → ★は 必殺技が使えるようになった!
- → ★は 悪い効果に かかりにくくなった!
- → ★は 攻撃時に HPが回復するようになった!
- → ★は 最大HP大ダウンの 呪いにかかった!
- → ★は 最大HP小ダウンの 呪いにかかった!
- → ★は 生き返った!
- → ★は 目が くらんだ!
- → ★は 目を さました!
- → ★は 盾で こうげきを はじきかえした!
- → ★は 盾で ガードしやすくなった!
- → ★は 聖女の守りを 受けた!
- → ★は 身をかわしやすくなった!
- → ★は MPを消費しなかった!
- ★が おむつっこりと 戦闘開始!
- ★が まもののむれと 戦闘開始!
- ★が ウッディアイたちと 戦闘開始!
- ★が ウッディアイと 戦闘開始!
- ★が デスパロットたちと 戦闘開始!
- ★が デスパロットと 戦闘開始!
- ★が ブラックチャックたちと 戦闘開始!
- ★が ブラックチャックと 戦闘開始!
- ★が プークプックと 戦闘開始!
- ★が ミイラ男たちと 戦闘開始!
- ★が リザードマンと 戦闘開始!
- ★が 戦闘に参加した!
- ★たちは ぜんめつした。
- ★の かぶと割り!
- ★の こうげき力が もとにもどった!
- ★の こうげき力が 少し あがった!
- ★の こうげき!
- ★の しゅび力が もとにもどった!
- ★の すてみ!
- ★の たいあたり!
- ★の たいぼく斬!
- ★の たたかいのビート!
- ★の とうこん討ち!
- ★の どうぐ倍化術!
- ★の どうぐ効果範囲が もとにもどった!
- ★の どうぐ範囲化術!
- ★の ばくれつけん!
- ★の ふういんのダンス!
- ★の まじん斬り!
- ★の みりょくが もとにもどった!
- ★の もろば斬り!
- ★の やいばくだき!
- ★の やいばのぼうぎょ!
- ★の よみがえり節!
- ★の アクロバットスター!
- ★の イオナズン!
- ★の イオラ!
- ★の エンドオブシーン!
- ★の オノむそう!
- ★の カオスエッジ!
- ★の キアリー!
- ★の キラキラポーンが きえた。
- ★の キラキラポーン!
- ★の キラージャグリング!
- ★の コマンド間隔が もとにもどった!
- ★の コマンド間隔が 少し 短くなった!
- ★の ゴッドジャグリング!
- ★の ゴールドフィンガー!
- ★の サイクロンアッパー!
- ★の ザオラル!
- ★の ザメハ!
- ★の シビれが きえた!
- ★の シールドアタック!
- ★の シールドブレイク!
- ★の スカラ!
- ★の スクルト!
- ★の スタンショット!
- ★の スペルガード!
- ★の スリープダガー!
- ★の ズッシード!
- ★の タイガークロー!
- ★の タナトスハント!
- ★の チャージタックル!
- ★の チャージ時間が 短くなった!
- ★の ティンクルバトン!
- ★の テンションが 20あがった!
- ★の テンションが 50あがった!
- ★の テンションが 5あがった!
- ★の テンションが もとにもどった。
- ★の テンションブースト!
- ★の トラップジャマー!
- ★の ドラムクラッシュ!
- ★の ナイトメアファング!
- ★の ハッスルダンス!
- ★の バイシオン!
- ★の ビッグシールド!
- ★の ピオリム!
- ★の ピンクタイフーン!
- ★の ファランクスの効果が きえた!
- ★の ファランクス!
- ★の フバーハ!
- ★の ブレス耐性が もとにもどった!
- ★の プラズマリムーバー!
- ★の プレートインパクト!
- ★の ベホイミ!
- ★の ベホイム!
- ★の ベホマラー!
- ★の ホイミ!
- ★の ホーリーライト!
- ★の ボケ!
- ★の マジステッキ!
- ★の マジックバリア!
- ★の マヒャデドス!
- ★の マヒャド!
- ★の マホステが きえた。
- ★の マホトラのころもが きえた!
- ★の マホトラのころも!
- ★の マホトラ!
- ★の ミラクルブースト!
- ★の メディカルデバイス!
- ★の メラゾーマ!
- ★の メラ!
- ★の ライガークラッシュ!
- ★の ラピッドステッキの効果が きえた!
- ★の ラピッドステッキ!
- ★の ラリホーマ!
- ★の ランドインパクト!
- ★の リベホイムのHP回復が おわった!
- ★の リベホイム!
- ★の ロストアタック!
- ★の ヴァイパーファング!
- ★の 一喝!
- ★の 不撓不屈!
- ★の 会心と呪文ぼうそう率が あがった!
- ★の 会心と呪文ぼうそう率が もとにもどった。
- ★の 会心まいしんラップ!
- ★の 会心ガードが きえた。
- ★の 会心ガード!
- ★の 会心必中!
- ★の 呪文の回復力が もとにもどった!
- ★の 呪文の威力が もとにもどった!
- ★の 呪文の耐性が もとにもどった!
- ★の 回復のララバイ!
- ★の 大きさが もとにもどった!
- ★の 天下無双!
- ★の 天使の守りが きえた。
- ★の 天使の守り!
- ★の 女神の祝福が きえた。
- ★の 女神の祝福!
- ★の 姿が もとにもどった!
- ★の 幻惑が とけた!
- ★の 強化ガジェット零式!
- ★の 心頭滅却!
- ★の 必殺技!
- ★の 攻撃時 HP回復が きえた!
- ★の 無心こうげき!
- ★の 無念無想!
- ★の 百花繚乱!
- ★の 盾ガード率が もとにもどった!
- ★の 真・やいばくだき!
- ★の 真・オノむそう!
- ★の 美しさに みがきがかかった!
- ★の 聖なる祈り!
- ★の 聖女の守りが きえた。
- ★の 聖女の守り!
- ★の 聖者の詩!
- ★の 荒神の舞!
- ★の 蒼天魔斬!
- ★の 身かわし率が もとにもどった!
- ★の 重さが ふえた!
- ★の 重さが もとにもどった!
- ★の 鉄甲斬!
- ★の 魔力かくせい!
- ★の 魔結界!
- ★の先制攻撃!
- ★は 1 G かくとく!
- ★は 107 Pの経験値 7 G かくとく!
- ★は 14066 Pの達人経験値をかくとく!
- ★は 1のダメージを うけた!
- ★は ★に ツッコミをいれた!
- ★は ★を おうえんした!
- ★は いやしそうを 使った!
- ★は うけをねらって ボケた!
- ★は おうぎのまいを 中断した。
- ★は おたけびをあげた!
- ★は おはらいを 中断した。
- ★は おはらいをした!
- ★は おむつっこりを やっつけた!
- ★は けんじゃのせいすいを 使った!
- ★は こんらんして おびえている。
- ★は しんでしまった。
- ★は すっぴんに もどった!
- ★は せかいじゅの葉を 使った!
- ★は たたかいのビートをうたった!
- ★は どうぐ範囲化術を 中断した。
- ★は ふういんのダンスをおどった!
- ★は ぶきみなひかりを 中断した。
- ★は まじん斬りを 中断した。
- ★は まほうのせいすいを 使った!
- ★は まほうの小ビンを 9個 使った!
- ★は まほうの小ビンを 使った!
- ★は まもののむれを やっつけた!
- ★は むげんのさとりが 使えるようになった!
- ★は やるきのジャーミィたちを やっつけた!
- ★は よみがえり節をうたった!
- ★は われにかえった!
- ★は アゲハ乱舞を まいおどった!
- ★は イオグランデが 使えるようになった!
- ★は イオナズンを となえた!
- ★は イオラを となえた!
- ★は ウッディアイたちを やっつけた!
- ★は ウッディアイを やっつけた!
- ★は ウルベア魔神兵強たちを やっつけた!
- ★は エンドオブシーンを 中断した。
- ★は オノむそうを 中断した。
- ★は キアリーを となえた!
- ★は キャットリベリオ強を やっつけた!
- ★は ゴールドフィンガーを 中断した。
- ★は ザオラルを となえた!
- ★は ザメハを となえた!
- ★は スカラを となえた!
- ★は スクルトを となえた!
- ★は スクルトを 中断した。
- ★は スタンショットが 使えるようになった!
- ★は スペルガードが 使えるようになった!
- ★は ズッシードを となえた!
- ★は タイガークローを 中断した。
- ★は タナトスハントを 中断した。
- ★は ティンクルバトンが 使えるようになった!
- ★は ティンクルバトンを 中断した。
- ★は テンションバーンが 使えるようになった!
- ★は デスパロットたちを やっつけた!
- ★は ドルマドンが 使えるようになった!
- ★は ハッスルダンスを おどった!
- ★は ハッスルダンスを 中断した。
- ★は バイシオンを となえた!
- ★は バイシオンを 中断した。
- ★は バランスパスタ★3を 使った!
- ★は ピオリムを となえた!
- ★は ピオリムを 中断した。
- ★は ファランクスが 使えるようになった!
- ★は フバーハを となえた!
- ★は ブラックチャックたちを やっつけた!
- ★は ブラックチャックを やっつけた!
- ★は プラズマリムーバーを 中断した。
- ★は プレートインパクトが 使えるようになった!
- ★は プークプックを やっつけた!
- ★は ヘルバトラー強を やっつけた!
- ★は ベホイミを となえた!
- ★は ベホイムを となえた!
- ★は ベホマラーを となえた!
- ★は ベホマラーを 中断した。
- ★は ホイミを となえた!
- ★は ホーリーライトが 使えるようになった!
- ★は マジックバリアを となえた!
- ★は マヒャデドスを となえた!
- ★は マヒャドを となえた!
- ★は マホトラを となえた!
- ★は ミイラ男たちを やっつけた!
- ★は ミラクルブーストが 使えるようになった!
- ★は メラを となえた!
- ★は メラゾーマを となえた!
- ★は ライガークラッシュを 中断した。
- ★は ラピッドステッキが 使えるようになった!
- ★は ラリホーマを となえた!
- ★は ランドインパクトを 中断した。
- ★は リザードマンを やっつけた!
- ★は リベホイムを となえた!
- ★は 会心まいしんラップをうたった!
- ★は 全身に ちからを ためた!
- ★は 呪いで うごけない!
- ★は 呪術師マリーン強を やっつけた!
- ★は 回復のララバイを 中断した。
- ★は 回復のララバイをうたった!
- ★は 天下無双を 中断した。
- ★は 天使の守りを 受けた!
- ★は 天魔クァバルナ強たちを やっつけた!
- ★は 女神の祝福が 使えるようになった!
- ★は 守護者ラズバーン強を やっつけた!
- ★は 復活の杖が 使えるようになった!
- ★は 心頭滅却を 中断した。
- ★は 怪蟲アラグネ強を やっつけた!
- ★は 悪い効果に かかりにくくなった!
- ★は 悪夢の右手強を やっつけた!
- ★は 悪魔長ジウギスを やっつけた!
- ★は 戦いをやめた。
- ★は 戦うのをやめた。
- ★は 暴君バサグランデ強を やっつけた!
- ★は 水竜ギルギッシュ強を やっつけた!
- ★は 特訓スタンプを 12 個 かくとく!
- ★は 特訓スタンプを 23 個 かくとく!
- ★は 真・オノむそうを 中断した。
- ★は 破戒王ベルムド強を やっつけた!
- ★は 磁界シールドを つくりだした!
- ★は 聖女の守りを 中断した。
- ★は 聖女の守りを 受けた!
- ★は 花ふぶきを まきおこした!
- ★は 蒼天魔斬を 中断した。
- ★は 覚醒プスゴンを やっつけた!
- ★は 超暴走魔法陣が 使えるようになった!
- ★は 身をかわしやすくなった!
- ★は 魔人エンラージャ強を やっつけた!
- ★は 魔軍師イッド強を やっつけた!
- ★の ファイアフォース!
- ★は 炎のチカラを 身にまとった!
- ★の ファイアフォースの 効果時間延長!
- ★の ファイアフォースが とけた!
- ★の アイスフォース!
- ★は 氷のチカラを 身にまとった!
- ★の アイスフォースの 効果時間延長!
- ★の ストームフォース!
- ★は 風と雷のチカラを 身にまとった!
- ★の ストームフォースの 効果時間延長!
- ★の ダークフォース!
- ★は 闇と土のチカラを 身にまとった!
- ★の ダークフォースの 効果時間延長!
- ★の ライトフォース!
- ★は 光のチカラを 身にまとった!
- ★の ライトフォースの 効果時間延長!
- ★の ライトフォースが とけた!
- ★の メイクアップ!
- ★の 美しさに みがきがかかった!
- ★は すっぴんに もどった!
- ★の マホターン!
- ★の マホカンタ!
- ★の前に 光のカベが あらわれた!
- EndTextBlock
- //↑ここまでコメント扱い
Add Comment
Please, Sign In to add comment