Guest User

Untitled

a guest
Nov 16th, 2015
803
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 117.56 KB | None | 0 0
  1. ////////////////////////////////////////////////////
  2. // Copyright (c) 2015 ikasam //
  3. // Released under the MIT license //
  4. // http://opensource.org/licenses/mit-license.php //
  5. ////////////////////////////////////////////////////
  6.  
  7. ///////////////////////////////////////////////////////////////////////////////////////////////
  8. //初期設定
  9.  
  10. //LogBaseAddr Offset
  11.  
  12. //ver 3.0? ID:r4f9Sd32氏感謝
  13. //CONST LBAbaseOS = $FF07F0
  14. //CONST LBAsytmOS = $1C0
  15. //CONST LBAchatOS = $6264
  16.  
  17. //ver 3.0.5a
  18. //CONST LBAbaseOS = $101B880
  19. //CONST LBAsytmOS = $1C0
  20. //CONST LBAchatOS = $625C
  21.  
  22. //ver 3.0.6a
  23. //CONST LBAbaseOS = $101C880
  24. //CONST LBAsytmOS = $1C0
  25. //CONST LBAchatOS = $625C
  26.  
  27. //ver 3.0.7a
  28. //DQXBaseAddr + PointerOffset → 各BaseAddr
  29. //CONST logPO = $101E880 //$101E554 + $32C
  30. //CONST staPO = $101EAC8 //$101E554 + $574
  31.  
  32. //ver 3.1.0a
  33. //DQXBaseAddr + PointerOffset → 各BaseAddr
  34. //CONST logPO = $FEC1C0 //$101E554 + $32C
  35. //CONST staPO = $FEC408 //$101E554 + $574
  36.  
  37. //ver 3.1.1a
  38. //DQXBaseAddr + PointerOffset → 各BaseAddr
  39. //CONST logPO = $FED220 //
  40. //CONST staPO = $FED468 //
  41. //各BaseAddr + DataOffset → 各dataAddr
  42. //CONST logDOsytm = $1C0
  43. //CONST logDOchat = $625C
  44.  
  45. //ver 3.1.5b
  46. //DQXBaseAddr + PointerOffset → 各BaseAddr
  47. CONST logPO = $100D230
  48. CONST staPO = $100D0F0
  49. //各BaseAddr + DataOffset → 各dataAddr
  50. CONST logDOsytm = $1C0 + $8
  51. CONST logDOchat = $625C + $8
  52.  
  53. //デフォルト表示(起動後切替可)
  54. CONST def_slog = true //システムログ
  55. CONST def_chat = false //チャットログ
  56. CONST def_sell = false //討伐売り纏め
  57. CONST def_batt = true //戦闘時状態表示
  58.  
  59. //メモリチェックインターバル(ミリ秒)
  60. CONST mciv = 500
  61.  
  62. //ファイル書込インターバル(ミリ秒)
  63. CONST fwiv = 1200
  64.  
  65. //ログは起動時の日付で処理
  66. CONST CLOG = true //Chatログ出力 cur_dir\YYYYMMDD_dqxlog4u_chat.log
  67. CONST SLOG = true //systemlogログファイル出力 cur_dir\YYYYMMDD_dqxlog4u_slog.log
  68. CONST FDBG = true //Debug出力 cur_dir\YYYYMMDD_dqxlog4u_debug.log
  69. //エラー出力 cur_dir\dqxlog4u_error.log
  70.  
  71. //ログ表示最大行数
  72. CONST info_slog_max = 12
  73. CONST info_chat_max = 12
  74. CONST info_sell_max = 50
  75. CONST info_batt_max = 50
  76.  
  77. //バフ効果時間(ログ取得的に5秒位時差有り)
  78. CONST maxtime_sklt = 120 - 5
  79. CONST maxtime_fbha = 120 - 5
  80. CONST maxtime_tnsn = 30 - 5
  81.  
  82. //バフ表示 プログレスバー用
  83. CONST progres_num = 20 //文字数
  84. CONST progres_ful = "█" //残り表示
  85. CONST progres_emp = "▒" // 空表示
  86.  
  87. //バフ表示 残り時間警告
  88. CONST time_warn_rest = 15 //警告残り秒数
  89. CONST time_warn_char = "*" //警告文字
  90.  
  91. //CONST DBG = true
  92.  
  93. ///////////////////////////////////////////////////////////////////////////////////////////////
  94. //既知の不具合とかTODO的なもの
  95. //
  96. //・systemLog
  97. //たまにゴミを読み込む ログ通番で避けてはいるけど運が悪いと変なの読むかも
  98. //
  99. //・ChatLog
  100. //ルーム振り分け無し
  101. //
  102. //・討伐売り
  103. //重い&あんまり凝ってないので参考程度に
  104. //
  105. //・戦闘データ表示
  106. //多分バグまみれ
  107. //ためる参の検知
  108. //
  109. //・その他
  110. //背景と同化する時に見づらい
  111. //
  112. //覚書は多くなってきたので最後へ
  113. ///////////////////////////////////////////////////////////////////////////////////////////////
  114.  
  115.  
  116. //各種定数
  117.  
  118. //CreateToolhelp32Snapshot
  119. CONST TH32CS_SNAPALL = $F
  120. CONST TH32CS_SNAPHEAPLIST = $1
  121. CONST TH32CS_INHERIT = $80000001
  122. CONST TH32CS_SNAPPROCESS = $2
  123. CONST TH32CS_SNAPTHREAD = $4
  124. CONST TH32CS_SNAPMODULE = $8
  125.  
  126. //OpenProcess
  127. CONST PROCESS_VM_OPERATION = $8
  128. CONST PROCESS_VM_READ = $10
  129. CONST PROCESS_VM_WRITE = $20
  130.  
  131. //配列サイズ用
  132. CONST ArryDwordSize = 4
  133. CONST ArryWordSize = 2
  134. CONST ArrySlogSize = $609B
  135. CONST ArryChatSize = (180 * 180) + (4 * 180)
  136.  
  137. //職業変換テーブル
  138. // public Dim Job_name[] = "dummy","勇者?","戦士","僧侶","魔法使い","武闘家","盗賊","旅芸人","バトルマスター","パラディン","魔法戦士","レンジャー","賢者","スーパースター","まもの使い","どうぐ使い","踊り子"
  139. public Dim Job_name[] = " ","勇?","戦士","僧侶","魔法","武闘","盗賊","旅芸","バト","パラ","魔戦","レン","賢者","スパ","まも","どう","踊り"
  140. // public Dim Job_name[] = " ","?","戦","僧","魔","武","盗","旅","バ","パ","電","レ","賢","ス","ま","ど","踊"
  141.  
  142. public HASHTBL castTimeMax
  143. castTimeMax["超はやぶさ斬り"] = 45
  144. castTimeMax["ギガブレイク"] = 60
  145. castTimeMax["ビッグバン"] = 60
  146. castTimeMax["全身全霊斬り"] = 65
  147. castTimeMax["鉄甲斬"] = 60
  148. castTimeMax["真・オノむそう"] = 60
  149. castTimeMax["さみだれ突き"] = 45
  150. castTimeMax["ジゴスパーク"] = 60
  151. castTimeMax["ラピッドステッキ"] = 90
  152. castTimeMax["ティンクルバトン"] = 90
  153. castTimeMax["水流のかまえ"] = 90
  154. castTimeMax["奥義・棍閃殺"] = 70
  155. castTimeMax["超暴走魔法陣"] = 60
  156. castTimeMax["復活の杖"] = 60
  157. castTimeMax["カオスエッジ"] = 60
  158. castTimeMax["ナイトメアファング"] = 60
  159. castTimeMax["疾風迅雷"] = 45
  160. castTimeMax["極竜打ち"] = 50
  161. castTimeMax["サイクロンアッパー"] = 45
  162. castTimeMax["ライガークラッシュ"] = 65
  163. castTimeMax["ピンクタイフーン"] = 60
  164. castTimeMax["百花繚乱"] = 60
  165. castTimeMax["スタンショット"] =120
  166. castTimeMax["プレートインパクト"] = 75
  167. castTimeMax["シャイニングボウ"] = 60
  168. castTimeMax["弓聖の守り星"] = 30
  169. castTimeMax["ダークネスショット"] = 60
  170. castTimeMax["フローズンバード"] = 60
  171. castTimeMax["デュアルブレイカー"] = 75
  172. castTimeMax["ファランクス"] = 60
  173. castTimeMax["スペルガード"] = 30
  174. castTimeMax["達人の呼吸"] = 90
  175. castTimeMax["岩石おとし"] = 45
  176. castTimeMax["せいけん爆撃"] = 45
  177. castTimeMax["よみがえり節"] = 45
  178. castTimeMax["魔力のバラード"] = 90
  179. castTimeMax["回復のララバイ"] = 90
  180.  
  181. castTimeMax["チャージタックル"] = 75
  182. castTimeMax["真・やいばくだき"] = 60
  183. castTimeMax["ホーリーライト"] = 45
  184. castTimeMax["女神の祝福"] = 90
  185. castTimeMax["マヒャデドス"] = 60
  186. castTimeMax["メラガイアー"] = 65
  187. castTimeMax["無念無想"] =180
  188. castTimeMax["ためる参"] = 60
  189. castTimeMax["ギガボンバー"] = 45
  190. castTimeMax["サプライズラッシュ"] = 70
  191. castTimeMax["エンドオブシーン"] = 15
  192. castTimeMax["ゴッドジャグリング"] = 75
  193. castTimeMax["たたかいのビート"] =130
  194. castTimeMax["テンションバーン"] = 75
  195. castTimeMax["ミラクルブースト"] = 90
  196. castTimeMax["グランドネビュラ"] = 45
  197. castTimeMax["聖騎士の堅陣"] = 60
  198. castTimeMax["フォースブレイク"] = 90
  199. castTimeMax["マダンテ"] =120
  200. castTimeMax["あんこくのきり"] = 90
  201. castTimeMax["ジバルンバ"] = 45
  202. castTimeMax["フェンリルアタック"] = 60
  203. castTimeMax["イオグランデ"] = 50
  204. castTimeMax["むげんのさとり"] =150
  205. castTimeMax["ドルマドン"] = 60
  206. castTimeMax["バギムーチョ"] = 45
  207. castTimeMax["ミリオンスマイル"] = 30
  208. castTimeMax["スキルクラッシュ"] = 60
  209. castTimeMax["ウォークライ"] =120
  210. castTimeMax["メディカルデバイス"] = 60
  211. castTimeMax["プラズマリムーバー"] = 15
  212. castTimeMax["ドラゴンステップ"] = 40
  213. castTimeMax["ビーナスステップ"] = 40
  214. castTimeMax["ロイヤルステップ"] = 40
  215. castTimeMax["つるぎの舞"] = 45
  216. castTimeMax["戦鬼の乱れ舞"] = 45
  217.  
  218. ///////////////////////////////////////////////////////////////////////////////////////////////
  219. //各種変数
  220.  
  221. //メモリ取得
  222. public DqxWid
  223. public DqxPid
  224. public DqxPhnd
  225. public DqxBaseAddr
  226. public logBA
  227. public logBAsytm
  228. public logBAchat
  229. public logSystmSta
  230. public logSystmEnd
  231. public slogIdLast //読み込みエラー対策
  232. public staBA
  233.  
  234. //戦闘データ処理用
  235. public batt_sta_id
  236. public batt_end_id
  237.  
  238. //処理軽減用 最終通番
  239. public info_slog_last
  240. public info_chat_last
  241. public info_sell_last
  242. public info_batt_last
  243.  
  244. //処理軽減用 保持数
  245. public info_slog_keep
  246. public info_chat_keep
  247.  
  248. //表示用
  249. public info_sysm_str //スクリプトの状態表示
  250. public info_slog_str //システムログ
  251. public info_chat_str //チャット
  252. public info_sell_str //討伐売り
  253. public info_batt_str //戦闘データ
  254.  
  255.  
  256. //表示位置用
  257. public tgl_log_full
  258. public tgl_log_dqxx
  259. public tgl_log_dqxy
  260. public tgl_log_dqxw
  261. public tgl_log_dqxh
  262. public tgl_log_clix
  263. public tgl_log_cliy
  264. public tgl_log_cliw
  265. public tgl_log_clih
  266. //表示位置調整用
  267. public info_sysm_x
  268. public info_sysm_y
  269. public info_sysm_h
  270. public info_slog_h
  271. public info_chat_h
  272. public info_sell_h
  273. public info_batt_h
  274. public info_batt_w
  275.  
  276. //スレッド排他制御用
  277. public info_sysm_trd
  278. public info_slog_trd
  279. public info_chat_trd
  280. public info_sell_trd
  281. public info_batt_trd
  282.  
  283. //削除予定
  284. public infohead
  285. public infostr
  286. public infowinx
  287. public infowiny
  288. public infofixedx
  289. public infofixedy
  290. public infofixed_flg
  291.  
  292. //ログ出力先
  293. PUBLIC clogpath
  294. PUBLIC slogpath
  295. PUBLIC dbgpath
  296. PUBLIC errpath
  297.  
  298. //戦闘状態検知用
  299. public fight_flg
  300. public fight_sta
  301. public fight_time //DPS測定用総戦闘時間
  302. public fight_tmpname //2行以上のログの派生元
  303. public HASHTBL fight_char = HASH_SORT //戦闘中のキャラ key:名前 data:総食らいダメージ
  304. public HASHTBL fight_mons = HASH_SORT //戦闘中のモンスター key:名前 data:総食らいダメージ
  305. public HASHTBL fight_charAtk = HASH_SORT //戦闘中のキャラ key:名前 data:総攻撃ダメージ
  306. public HASHTBL fight_monsAtk = HASH_SORT //戦闘中のモンスター key:名前 data:総攻撃ダメージ
  307.  
  308. //速度計測用
  309. public timer_system //全体的な処理速度
  310. public timer_fwrite //ログファイル書き込み処理速度
  311. public timer_fwrite_old //表示用
  312.  
  313. public timer_slogm //システムログメモリ読み出し処理速度
  314. public timer_chatm //チャットログメモリ読み出し処理速度
  315. public timer_slogf //システムログ整形処理速度
  316. public timer_chatf //チャットログ整形処理速度
  317. public timer_slogp //システムログ表示処理速度
  318. public timer_chatp //チャットログ表示処理速度
  319.  
  320. public timer_sellf //討伐売り整形処理速度
  321. public timer_battf //戦闘データ整形処理速度
  322.  
  323. public timer_stamf //ステータスデータ取得整形処理速度
  324.  
  325.  
  326. //処理切替用
  327. public tgl_slog //システムログ
  328. public tgl_chat //システムチャット
  329. public tgl_sell //討伐売り整形表示
  330. public tgl_batt //戦闘データ整形表示
  331.  
  332. //システム チャット保存用
  333. public HASHTBL syslog_time = HASH_SORT
  334. public HASHTBL syslog_type = HASH_SORT
  335. public HASHTBL syslog_str = HASH_SORT
  336. public HASHTBL syslog_wflg = HASH_SORT //ファイル書込チェック用
  337. public HASHTBL syslog_bflg = HASH_SORT //戦闘データ処理チェック用
  338. public HASHTBL chtlog_time = HASH_SORT
  339. public HASHTBL chtlog_srcid = HASH_SORT
  340. public HASHTBL chtlog_desid = HASH_SORT
  341. public HASHTBL chtlog_room = HASH_SORT
  342. public HASHTBL chtlog_tmp = HASH_SORT
  343. public HASHTBL chtlog_src = HASH_SORT
  344. public HASHTBL chtlog_des = HASH_SORT
  345. public HASHTBL chtlog_str = HASH_SORT
  346. public HASHTBL chtlog_wflg = HASH_SORT //ファイル書込チェック用
  347. public HASHTBL chtlog_head = HASH_SORT //表示先頭保持用
  348.  
  349. public HASHTBL cell_data = HASH_SORT //討伐売り纏め用
  350.  
  351. public HASHTBL batt_data = HASH_SORT //戦闘データ纏め用
  352. //charBA(n) + $E8 → キャラクター名
  353. //charBA(n) + $10C → キャラクタID(サポは$00000000)
  354. //charBA(n) + $121 → 職種類
  355. //charBA(n) + $122 → LV
  356. //charBA(n) + $124 → HPmax
  357. //charBA(n) + $126 → MPmax
  358. //charBA(n) + $13C → HPnow
  359. //charBA(n) + $13E → MPnow
  360. public HASHTBL sta_name //ステータス キャラ名
  361. public HASHTBL sta_id //ステータス キャラID
  362. public HASHTBL sta_job //ステータス 職業
  363. public HASHTBL sta_lv //ステータス レベル
  364. public HASHTBL sta_hpmax //ステータス HP最大値
  365. public HASHTBL sta_mpmax //ステータス MP最大値
  366. public HASHTBL sta_hpnow //ステータス HP現在値
  367. public HASHTBL sta_mpnow //ステータス MP現在値
  368.  
  369. //[攻 ス フ 結 速 魔 回] 聖 女 天 盾 守 会 捨 衣 ポ 反 転 rH rM 炎 氷 風 闇 光 魅 避 詠 ラ テ
  370. //女 守 反 転 rH rM 炎 氷 風 闇 光 避
  371.  
  372. //バフetc表示用
  373. //buff2 強化が2段階あるバフ
  374. //buff1 強化無しのバフ
  375. //castm キャストタイムのある技(自分用)
  376.  
  377. //nameにログで探す文字列 バフ(技)名
  378. public DIM buff2_name[] = "こうげき力", _
  379. "しゅび力", _
  380. "ブレス耐性", _
  381. "呪文耐性", _
  382. "コマンド間隔", _
  383. "呪文の威力", _
  384. "呪文の回復"
  385. //表示用 バフ(技)名
  386. public DIM buff2_sname[] = "攻", _
  387. "ス", _
  388. "フ", _
  389. "結", _
  390. "速", _
  391. "魔", _
  392. "回"
  393. //各バフの効果時間
  394. public DIM buff2_maxt[] = 120, _
  395. 120, _
  396. 120, _
  397. 120, _
  398. 120, _
  399. 120, _
  400. 120
  401. //効果段階と開始時間
  402. public DIM buff2_rank[length(buff2_name)][5]
  403. public DIM buff2_stat[length(buff2_name)][5]
  404.  
  405. //一段階バフ Aタイプ (重ね掛け時のログが別のもの)
  406. //の 重さアップの 効果延長!
  407. //の みりょくアップの 効果延長!
  408. //sets 開始文字列
  409. //rets 終了文字列
  410. //exts 延長文字列
  411. public DIM buff1a_stas[] = "重さが ふ", _
  412. "みりょくが あ", _
  413. "炎のチカラを", _
  414. "氷のチカラを", _
  415. "風と雷のチカラを", _
  416. "闇と土のチカラを", _
  417. "光のチカラを"
  418. public DIM buff1a_ends[] = "重さが も", _
  419. "みりょくが も", _
  420. "ファイアフォースが と", _
  421. "アイスフォースが と", _
  422. "ストームフォースが と", _
  423. "ダークフォースが と", _
  424. "ライトフォースが と"
  425. public DIM buff1a_exts[] = "重さアップの 効", _
  426. "みりょくアップの 効", _
  427. "ファイアフォースの 効", _
  428. "アイスフォースの 効", _
  429. "ストームフォースの 効", _
  430. "ダークフォースの 効", _
  431. "ライトフォースの 効"
  432. //表示用 バフ(技)名
  433. public DIM buff1a_sname[] = "重", _
  434. "魅", _
  435. "炎", _
  436. "氷", _
  437. "風", _
  438. "闇", _
  439. "光"
  440. //各バフの効果時間
  441. public DIM buff1a_maxt[] = 90, _
  442. 180, _
  443. 120, _
  444. 120, _
  445. 120, _
  446. 120, _
  447. 120
  448. //効果段階と経過時間
  449. public DIM buff1a_rank[length(buff1a_stas)][5]
  450. public DIM buff1a_stat[length(buff1a_stas)][5]
  451.  
  452. //一段階バフ Bタイプ (重ね掛け時のログが同じもの)
  453. //sets 開始文字列
  454. //rets 終了文字列
  455. public DIM buff1b_stas[] = "マホステ効", _
  456. "マホトラのころもを", _
  457. "会心ガード!", _
  458. "盾で ガ", _
  459. "悪い効果に かかりに", _
  460. "聖女の守りを", _
  461. "美しさに み"
  462. public DIM buff1b_ends[] = "マホステが", _
  463. "マホトラのころもが", _
  464. "会心ガードが", _
  465. "盾ガード率", _
  466. "キラキラポーンが き", _
  467. "聖女の守りが", _
  468. "すっぴんに も"
  469. //表示用 バフ(技)名
  470. public DIM buff1b_sname[] = "捨", _
  471. "衣", _
  472. "会", _
  473. "盾", _
  474. "ポ", _
  475. "聖", _
  476. "メ"
  477. //各バフの効果時間
  478. public DIM buff1b_maxt[] = 60, _
  479. 60, _
  480. 120, _
  481. 180, _
  482. 120, _
  483. 120, _
  484. 120
  485.  
  486. //効果段階と経過時間
  487. public DIM buff1b_rank[length(buff1b_stas)][5]
  488. public DIM buff1b_stat[length(buff1b_stas)][5]
  489.  
  490. //一段階バフ Cタイプ (個別用)
  491. //表示用 バフ(技)名
  492. public DIM buff1c_sname[] = "詠", _
  493. "ラ"
  494. //各バフの効果時間
  495. public DIM buff1c_maxt[] = 120, _
  496. 60
  497. //効果段階と経過時間
  498. public DIM buff1c_rank[length(buff1c_sname)][5]
  499. public DIM buff1c_stat[length(buff1c_sname)][5]
  500.  
  501. //キャストタイムの計測
  502. //castm[技名]=使用時刻
  503. public HASHTBL castm
  504.  
  505. //HASHTBL 変数
  506. //HASHTBL 変数 = HASH_CASECARE // 大文字小文字を区別する(デフォルトは区別しない)
  507. //HASHTBL 変数 = HASH_SORT // 順列で読出す時にキーはソートされている
  508. //変数[キー] = データ
  509. //変数[キー, HASH_EXISTS] // キーが存在すればTrueを返す
  510. //変数[キー, HASH_REMOVE] // 削除できればTrueを返す
  511. //変数[順列番号, HASH_KEY] // キーを返す
  512. //変数[順列番号, HASH_VAL] // 値を返す
  513. //変数 = HASH_REMOVEALL //
  514.  
  515. ///////////////////////////////////////////////////////////////////////////////////////////////
  516. //各種設定
  517.  
  518. //システムログ読込アドレス
  519. logSystmSta = 0
  520. logSystmEnd = 0
  521. //読み込みエラー対策
  522. slogIdLast = 0
  523.  
  524. //最終処理通番初期化
  525. info_slog_last = 0
  526. info_chat_last = 0
  527. info_sell_last = 0
  528. info_batt_last = 0
  529.  
  530. //データ保持数初期化
  531. info_slog_keep = 0
  532. info_chat_keep = 0
  533.  
  534. //デバッグログ初期化
  535. info_sysm_str = ""
  536. info_slog_str = ""
  537. info_chat_str = ""
  538. info_sell_str = ""
  539. info_batt_str = ""
  540.  
  541. //表示位置初期化
  542. info_sysm_x = 0
  543. info_sysm_y = 0
  544.  
  545.  
  546. //初回比較時用
  547. logBA = -1
  548. staBA = -1
  549.  
  550. //戦闘データ処理用
  551. batt_sta_id = 0
  552. batt_end_id = 0
  553.  
  554. //バフ情報初期化
  555. for i=0 TO length(buff2_name) - 1
  556. for j=0 TO 5 - 1
  557. buff2_rank[i][j] = 0
  558. next
  559. next
  560. for i=0 TO length(buff1a_stas) - 1
  561. for j=0 TO 5 - 1
  562. buff1a_rank[i][j] = 0
  563. next
  564. next
  565. for i=0 TO length(buff1b_stas) - 1
  566. for j=0 TO 5 - 1
  567. buff1b_rank[i][j] = 0
  568. next
  569. next
  570.  
  571. //出力用日付取得 パス決定
  572. GETTIME()
  573. clogpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_chat.log"
  574. slogpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_slog.log"
  575. dbgpath = GET_CUR_DIR + "\" + G_TIME_YY + G_TIME_MM2 + G_TIME_DD2 + "_dqxlog4u_debug.log"
  576.  
  577. //エラーログ出力先
  578. Option LogPath = GET_CUR_DIR + "\" + "dqxlog4u_error.log"
  579. LOGPRINT(false)
  580. //LOGPRINT(true,0,0,512,1020)//debug用
  581.  
  582. //タイマー初期化
  583. timer_system = 0
  584. timer_slogm = 0
  585. timer_chatm = 0
  586. timer_slogf = 0
  587. timer_chatf = 0
  588. timer_stamf = 0
  589.  
  590. //切替初期化
  591. tgl_slog = def_slog
  592. tgl_chat = def_chat
  593. tgl_sell = def_sell
  594. tgl_batt = def_batt
  595.  
  596. //スレッド排他制御
  597. info_sysm_trd = Mutex.Init("info_sysm_trd")
  598. info_slog_trd = Mutex.Init("info_slog_trd")
  599. info_chat_trd = Mutex.Init("info_chat_trd")
  600. info_sell_trd = Mutex.Init("info_sell_trd")
  601. info_batt_trd = Mutex.Init("info_batt_trd")
  602.  
  603. ///////////////////////////////////////////////////////////////////////////////////////////////
  604. //開始
  605. ///////////////////////////////////////////////////////////////////////////////////////////////
  606.  
  607. //初回のプロセスとベースアドレス情報取得
  608. processCHK()
  609.  
  610. //随時出力用カウンタ
  611. OLogcnt = 0
  612. OChtcnt = 0
  613.  
  614. //戦闘用
  615. fight_flg = 0
  616. fight_sta = 0
  617.  
  618. //プロセス取得までループ
  619. While processCHK() = false
  620. Sleep(1)
  621. Wend
  622.  
  623. //各表示スレッド処理
  624. tgl_log_full = true //表示位置 true:全画面用 falase:ウィンドウ用(右側)
  625. THREAD TRD_info_sysm()
  626. THREAD TRD_info_slog()
  627. THREAD TRD_info_chat()
  628. THREAD TRD_info_sell()
  629. THREAD TRD_info_batt()
  630.  
  631. //ログファイル出力
  632. //重いのでスレッド
  633. THREAD TRD_log_output()
  634.  
  635. While true
  636. timer_system = GETTIME() * 1000 + G_TIME_ZZ
  637.  
  638. Mutex.Lock(info_sysm_trd)
  639.  
  640. info_sysm_str = ""
  641.  
  642. //LogBaseAddrを取得してチェック
  643. IFB false = logBaseCHK()
  644. info_sysm_str = info_sysm_str + "logBaseCHK:NG"
  645. Mutex.Unlock("info_sysm_trd",info_sysm_trd)
  646.  
  647. //失敗時はプロセス情報も再チェック
  648. Odbg("logBaseCHK():checkNG recheck")
  649. processCHK()
  650.  
  651. //キャラ変更などの為 リセット (起動している限りは連番?)
  652. Mutex.Lock(info_slog_trd)
  653. info_slog_str = ""
  654. slogIdLast = 0
  655. syslog_time = HASH_REMOVEALL
  656. syslog_type = HASH_REMOVEALL
  657. syslog_str = HASH_REMOVEALL
  658. syslog_wflg = HASH_REMOVEALL
  659. syslog_bflg = HASH_REMOVEALL
  660. Mutex.Unlock("info_slog_trd",info_slog_trd)
  661.  
  662. Mutex.Lock(info_chat_trd)
  663. info_chat_str = ""
  664. chtlog_time = HASH_REMOVEALL
  665. chtlog_srcid = HASH_REMOVEALL
  666. chtlog_desid = HASH_REMOVEALL
  667. chtlog_room = HASH_REMOVEALL
  668. chtlog_tmp = HASH_REMOVEALL
  669. chtlog_src = HASH_REMOVEALL
  670. chtlog_des = HASH_REMOVEALL
  671. chtlog_str = HASH_REMOVEALL
  672. chtlog_wflg = HASH_REMOVEALL
  673. chtlog_head = HASH_REMOVEALL
  674. Mutex.Unlock("info_chat_trd",info_chat_trd)
  675.  
  676. Mutex.Lock(info_sell_trd)
  677. info_sell_str = ""
  678. cell_data = HASH_REMOVEALL
  679. Mutex.Unlock("info_sell_trd",info_sell_trd)
  680.  
  681. Sleep(5)
  682. Continue
  683. ELSE
  684. info_sysm_str = info_sysm_str + "logBaseCHK:OK" + "<#CR>"
  685. ENDIF
  686.  
  687. //ステータス
  688. staBaseCHK()
  689.  
  690. IF GETKEYSTATE(VK_F5) Then tgl_slog = !tgl_slog
  691. IF GETKEYSTATE(VK_F6) Then tgl_chat = !tgl_chat
  692. IF GETKEYSTATE(VK_F7) Then tgl_sell = !tgl_sell
  693. IF GETKEYSTATE(VK_F8) Then tgl_batt = !tgl_batt
  694. IFB GETKEYSTATE(VK_F9)
  695. processCHK()//ウィンドウサイズ変更に追従
  696. tgl_log_full = !tgl_log_full
  697. ENDIF
  698.  
  699. //SystemLog
  700. GetSlogMemFormat()
  701. IFB tgl_slog
  702. GetSlogPrint()
  703. ELSE
  704. //無効化時
  705. // timer_slogm = 0
  706. // timer_slogf = 0
  707. timer_slogp = 0
  708. ENDIF
  709.  
  710. //ChatLog
  711. GetChatMemFormat()
  712. IFB tgl_chat
  713. GetChatPrint()
  714. ELSE
  715. //無効化時
  716. // timer_chatm = 0
  717. // timer_chatf = 0
  718. timer_chatp = 0
  719. ENDIF
  720.  
  721. //討伐売り
  722. IFB tgl_sell
  723. sellFormat()
  724. ELSE
  725. //無効化時
  726. timer_sellf = 0
  727. ENDIF
  728.  
  729. //戦闘データ
  730. IFB tgl_batt
  731. battFormat()
  732. ELSE
  733. //無効化時
  734. timer_stamf = 0
  735. timer_battf = 0
  736. ENDIF
  737.  
  738. timer_system = (GETTIME() * 1000 + G_TIME_ZZ) - timer_system
  739.  
  740. info_sysm_str = info_sysm_str + "保持データ数 "
  741. info_sysm_str = info_sysm_str + " システム:" + info_slog_keep
  742. info_sysm_str = info_sysm_str + " チャット:" + info_chat_keep
  743. info_sysm_str = info_sysm_str + "<#CR>"
  744.  
  745. info_sysm_str = info_sysm_str + "システムF5:" + tgl_slog
  746. info_sysm_str = info_sysm_str + " チャットF6:" + tgl_chat
  747. info_sysm_str = info_sysm_str + " 討伐情報F7:" + tgl_sell
  748. info_sysm_str = info_sysm_str + " 戦闘情報F8:" + tgl_batt
  749. info_sysm_str = info_sysm_str + " 表示切替F9:" + tgl_log_full
  750. info_sysm_str = info_sysm_str + "<#CR>"
  751. // "SysLog Mem Format Print|Chat Mem Format Print| sell|status batt| loop overhead(ms)"
  752. // 00000 00000 00000| 00000 00000 00000|00000| 00000 00000|00000 00000
  753. // 12345 12 1 |123 12 1 | 1 1 1234 1234
  754. info_sysm_str = info_sysm_str + "SysLog Mem Format Print|Chat Mem Format Print| sell|status batt| loop overhead(ms)" + "<#CR>"
  755. info_sysm_str = info_sysm_str + " "
  756. info_sysm_str = info_sysm_str + format(timer_slogm ,5) + " "
  757. info_sysm_str = info_sysm_str + format(timer_slogf ,5) + " "
  758. info_sysm_str = info_sysm_str + format(timer_slogp ,5) + "| "
  759. info_sysm_str = info_sysm_str + format(timer_chatm ,5) + " "
  760. info_sysm_str = info_sysm_str + format(timer_chatf ,5) + " "
  761. info_sysm_str = info_sysm_str + format(timer_chatp ,5) + "|"
  762. info_sysm_str = info_sysm_str + format(timer_sellf ,5) + "| "
  763. info_sysm_str = info_sysm_str + format(timer_stamf ,5) + " "
  764. info_sysm_str = info_sysm_str + format(timer_battf ,5) + "|"
  765. info_sysm_str = info_sysm_str + format(timer_system,5) + " "
  766. info_sysm_str = info_sysm_str + format(timer_system - _
  767. (timer_slogm + timer_slogf + timer_slogp + timer_chatm + timer_chatf + timer_chatp + timer_sellf + timer_battf),5) _
  768. + " " + "<#CR>"
  769.  
  770. //戦闘情報
  771. fight_info()
  772.  
  773. //メモリチェックインターバル
  774. tmp_st = VAL(format( (mciv - timer_system) / 1000 ,5,3))
  775. info_sysm_str = info_sysm_str + "sleep:" + format(tmp_st,8) + "<#CR>"
  776. info_sysm_str = info_sysm_str + "write_sleep:" + format(timer_fwrite_old,8) //最終行の改行は無し
  777.  
  778. Mutex.Unlock("info_sysm_trd",info_sysm_trd)
  779.  
  780. IFB tmp_st > 0
  781. Sleep(tmp_st)
  782. Else
  783. //時間超過
  784. Sleep(0.001)
  785. ENDIF
  786. // ExitExit
  787. WEND
  788.  
  789. Mutex.Release("info_sysm_trd",info_sysm_trd)
  790. Mutex.Release("info_slog_trd",info_slog_trd)
  791. Mutex.Release("info_chat_trd",info_chat_trd)
  792. Mutex.Release("info_sell_trd",info_sell_trd)
  793. Mutex.Release("info_batt_trd",info_batt_trd)
  794.  
  795.  
  796. ExitExit
  797.  
  798. ///////////////////////////////////////////////////////////////////////////////////////////////
  799. //終了
  800. ///////////////////////////////////////////////////////////////////////////////////////////////
  801.  
  802.  
  803.  
  804. ///////////////////////////////////////////////////////////////////////////////////////////////
  805. // DLL定義
  806.  
  807. DEF_DLL GetWindowThreadProcessId(HWND,Var DWORD) :DWORD :User32.dll
  808. DEF_DLL OpenProcess(DWORD,BOOL,DWORD) :DWORD :Kernel32.dll
  809.  
  810. DEF_DLL ReadProcessMemory(DWORD,DWORD,Var byte[], DWORD, Var DWORD):BOOL:kernel32.dll
  811.  
  812. DEF_DLL CloseHandle(DWORD) :BOOL :Kernel32.dll
  813. DEF_DLL GetProcAddress(DWORD, string): DWORD: kernel32.dll
  814. DEF_DLL CreateToolhelp32Snapshot( Long, Long) :Long :Kernel32.dll
  815.  
  816. //typedef struct tagMODULEENTRY32 {
  817. // DWORD dwSize;
  818. // DWORD th32ModuleID;
  819. // DWORD th32ProcessID;
  820. // DWORD GlblcntUsage;
  821. // DWORD ProccntUsage;
  822. // BYTE *modBaseAddr;
  823. // DWORD modBaseSize;
  824. // HMODULE hModule;
  825. // TCHAR szModule[MAX_MODULE_NAME32 + 1];
  826. // TCHAR szExePath[MAX_PATH];
  827. //} MODULEENTRY32, *PMODULEENTRY32;
  828. //DEF_DLL Module32First( Long, MODULEENTRY32) :Long :Kernel32.dll
  829. DEF_DLL Module32First( Long,{ DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD,string , string} ) :BOOL :Kernel32.dll
  830.  
  831. //int MultiByteToWideChar(
  832. // UINT CodePage, // コードページ
  833. // DWORD dwFlags, // 文字の種類を指定するフラグ
  834. // LPCSTR lpMultiByteStr, // マップ元文字列のアドレス
  835. // int cchMultiByte, // マップ元文字列のバイト数
  836. // LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス
  837. // int cchWideChar // バッファのサイズ
  838. //);
  839. DEF_DLL MultiByteToWideChar(dword, dword, byte[], int, var wstring, int): int: kernel32.dll
  840.  
  841. CONST CP_ACP = 0 // default to ANSI code page
  842. CONST CP_OEMCP = 1 // default to OEM code page
  843. CONST CP_MACCP = 2 // default to MAC code page
  844. CONST CP_THREAD_ACP = 3 // current thread's ANSI code page
  845. CONST CP_SYMBOL = 42 // SYMBOL translations
  846. CONST CP_UTF7 = 65000 // UTF-7 translation
  847. CONST CP_UTF8 = 65001 // UTF-8 translation
  848. CONST ERROR_INVALID_PARAMETER = 87 // dderror
  849. CONST ERROR_INSUFFICIENT_BUFFER = 122 // dderror
  850. CONST ERROR_INVALID_FLAGS = 1004
  851. CONST ERROR_NO_UNICODE_TRANSLATION = 1113
  852. DEF_DLL MultiByteToWideChar(dword, dword, byte[], int, var wstring, int): int: kernel32.dll
  853. CONST MB_PRECOMPOSED = $00000001 // use precomposed chars
  854. CONST MB_COMPOSITE = $00000002 // use composite chars
  855. CONST MB_USEGLYPHCHARS = $00000004 // use glyph chars, not ctrl chars
  856. CONST MB_ERR_INVALID_CHARS = $00000008 // error for invalid chars
  857.  
  858. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  859. //ユーザー定義
  860.  
  861. //スクリプト状態表示(スレッド処理)
  862. PROCEDURE TRD_info_sysm()
  863.  
  864. info_sysm_str = "start"
  865.  
  866. FUKIDASI(info_sysm_str,info_sysm_x,info_sysm_y,0,8,"MS 明朝",$FFFF00,$000000,-2)
  867.  
  868. //FUKIDASI ID取得
  869. info_sysm_id = GETID(GET_FUKIDASI_WIN)
  870. IFB -1 = info_sysm_id
  871. MSGBOX("Ffukidsi:NG")
  872. ExitExit
  873. ENDIF
  874.  
  875. WHILE true
  876.  
  877. Mutex.Lock(info_sysm_trd)
  878.  
  879. //<#CR>毎の長さを測定
  880. max_len = 0
  881. arry_info_sysm = SPLIT(info_sysm_str,"<#CR>",FALSE,FALSE)
  882. FOR i = 0 TO (LENGTH(arry_info_sysm) - 1)
  883. IF max_len < LENGTHB(arry_info_sysm[i]) Then max_len = LENGTHB(arry_info_sysm[i])
  884. NEXT
  885.  
  886. //最大長にパディング(右寄せ)
  887. tmpinfo_sysm = ""
  888. FOR i = 0 TO (LENGTH(arry_info_sysm) - 1)
  889. tmpinfo_sysm = tmpinfo_sysm + format(" ",max_len - LENGTHB(arry_info_sysm[i]) ) + arry_info_sysm[i] + "<#CR>"
  890. NEXT
  891.  
  892. //表示位置決め
  893. IFB tgl_log_full
  894. info_sysm_x = ( tgl_log_clix + ( tgl_log_cliw / 2 ) ) - ( STATUS(info_sysm_id,ST_WIDTH) / 2 )
  895. info_sysm_y = tgl_log_cliy
  896. info_sysm_trans = -2
  897. ELSE
  898. info_sysm_x = tgl_log_dqxx + tgl_log_dqxw
  899. info_sysm_y = tgl_log_dqxy
  900. info_sysm_trans = 0
  901. ENDIF
  902.  
  903. FUKIDASI(tmpinfo_sysm,info_sysm_x,info_sysm_y,0,8,"MS 明朝",$FFFF00,$000001,info_sysm_trans)
  904. info_sysm_h = STATUS(info_sysm_id,ST_HEIGHT)
  905.  
  906. Mutex.Unlock("info_sysm_trd",info_sysm_trd)
  907.  
  908. Sleep(0.1)
  909. Wend
  910. FEND
  911.  
  912. //システムログ表示(スレッド処理)
  913. PROCEDURE TRD_info_slog()
  914. info_slog_x = 0
  915. info_slog_y = 20
  916.  
  917. info_slog_str = "start"
  918.  
  919. FUKIDASI(info_slog_str,info_slog_x,info_slog_y,0,8,"MS 明朝",$FFFFFF,$000000,-2)
  920.  
  921. //FUKIDASI ID取得
  922. info_slog_id = GETID(GET_FUKIDASI_WIN)
  923. IFB -1 = info_slog_id
  924. MSGBOX("Ffukidsi:NG")
  925. ExitExit
  926. ENDIF
  927.  
  928. WHILE true
  929. IFB tgl_slog
  930.  
  931. Mutex.Lock(info_slog_trd)
  932.  
  933. //固定行分のみ表示
  934. ret = POS( "<#CR>" , info_slog_str , 0 - ( info_slog_max + 1 ))
  935.  
  936. //表示位置決め
  937. IFB tgl_log_full
  938. info_slog_x = tgl_log_clix
  939. info_slog_trans = -2
  940. ELSE
  941. info_slog_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
  942. info_slog_trans = 0
  943. ENDIF
  944. info_slog_y = info_sysm_y + info_sysm_h
  945.  
  946. FUKIDASI( COPY( info_slog_str , ret +1 ) ,info_slog_x,info_slog_y,0,8,"MS 明朝",$FFFFFF,$000001,info_slog_trans)
  947. info_slog_h = STATUS(info_slog_id,ST_HEIGHT)
  948.  
  949. Mutex.Unlock("info_slog_trd",info_slog_trd)
  950. ELSE
  951. info_slog_h = 0
  952. FUKIDASI()
  953. ENDIF
  954. Sleep(0.1)
  955. Wend
  956. FEND
  957.  
  958. //チャットログ表示(スレッド処理)
  959. PROCEDURE TRD_info_chat()
  960. info_chat_x = 0
  961. info_chat_y = 40
  962.  
  963. info_chat_str = "start"
  964.  
  965. FUKIDASI(info_chat_str,info_chat_x,info_chat_y,0,8,"MS 明朝",$00FFFF,$000000,-2)
  966.  
  967. //FUKIDASI ID取得
  968. info_chat_id = GETID(GET_FUKIDASI_WIN)
  969. IFB -1 = info_chat_id
  970. MSGBOX("Ffukidsi:NG")
  971. ExitExit
  972. ENDIF
  973.  
  974. WHILE true
  975. IFB tgl_chat
  976. Mutex.Lock(info_chat_trd)
  977.  
  978. //固定行分のみ表示
  979. ret = POS( "<#CR>" , info_chat_str , 0 - ( info_chat_max + 1 ) )
  980.  
  981. //表示位置決め
  982. IFB tgl_log_full
  983. info_chat_x = tgl_log_clix
  984. info_chat_trans = -2
  985. ELSE
  986. info_chat_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
  987. info_chat_trans = 0
  988. ENDIF
  989. info_chat_y = info_sysm_y + info_sysm_h + info_slog_h
  990.  
  991. FUKIDASI( COPY( info_chat_str , ret + 1 ) ,info_chat_x,info_chat_y,0,8,"MS 明朝",$00FFFF,$000001,info_chat_trans)
  992. info_chat_h = STATUS(info_chat_id,ST_HEIGHT)
  993.  
  994. Mutex.Unlock("info_chat_trd",info_chat_trd)
  995. ELSE
  996. info_chat_h = 0
  997. FUKIDASI()
  998. ENDIF
  999.  
  1000. Sleep(0.1)
  1001. Wend
  1002. FEND
  1003.  
  1004. //討伐整形表示(スレッド処理)
  1005. PROCEDURE TRD_info_sell()
  1006. info_sell_x = 0
  1007. info_sell_y = 60
  1008.  
  1009. info_sell_str = "start"
  1010.  
  1011. FUKIDASI(info_sell_str,info_sell_x,info_sell_y,0,8,"MS 明朝",$FF00FF,$000000,-2)
  1012.  
  1013. //FUKIDASI ID取得
  1014. info_sell_id = GETID(GET_FUKIDASI_WIN)
  1015. IFB -1 = info_sell_id
  1016. MSGBOX("Ffukidsi:NG")
  1017. ExitExit
  1018. ENDIF
  1019.  
  1020. WHILE true
  1021. IFB tgl_sell
  1022.  
  1023. Mutex.Lock(info_sell_trd)
  1024.  
  1025. //固定行分のみ表示
  1026. ret = POS( "<#CR>" , info_sell_str , 0 - ( info_sell_max + 1 ) )
  1027.  
  1028. //表示位置決め
  1029. IFB tgl_log_full
  1030. info_sell_x = tgl_log_clix
  1031. info_sell_trans = -2
  1032. ELSE
  1033. info_sell_x = tgl_log_dqxx + tgl_log_dqxw + info_batt_w
  1034. info_sell_trans = 0
  1035. ENDIF
  1036. info_sell_y = info_sysm_y + info_sysm_h + info_slog_h + info_chat_h
  1037.  
  1038. FUKIDASI( COPY( info_sell_str , ret + 1 ) ,info_sell_x,info_sell_y,0,8,"MS 明朝",$FF00FF,$000001,info_sell_trans)
  1039. info_sell_h = STATUS(info_sell_id,ST_HEIGHT)
  1040.  
  1041. Mutex.Unlock("info_sell_trd",info_sell_trd)
  1042. ELSE
  1043. info_sell_h = 0
  1044. FUKIDASI()
  1045. ENDIF
  1046.  
  1047. Sleep(0.1)
  1048. Wend
  1049. FEND
  1050.  
  1051. //戦闘データ整形表示(スレッド処理)
  1052. PROCEDURE TRD_info_batt()
  1053. info_batt_x = 0
  1054. info_batt_y = 80
  1055.  
  1056. info_batt_str = "start"
  1057.  
  1058. FUKIDASI(info_batt_str,info_batt_x,info_batt_y,0,8,"MS 明朝",$FFFFFF,$000000,-2)
  1059.  
  1060. //FUKIDASI ID取得
  1061. info_batt_id = GETID(GET_FUKIDASI_WIN)
  1062. IFB -1 = info_batt_id
  1063. MSGBOX("Ffukidsi:NG")
  1064. ExitExit
  1065. ENDIF
  1066.  
  1067. WHILE true
  1068. IFB tgl_batt
  1069.  
  1070. Mutex.Lock(info_batt_trd)
  1071.  
  1072. //<#CR>毎の長さを測定
  1073.  
  1074. //最大長にパディング(右寄せ)
  1075. // max_len = 0
  1076. // arry_info_batt = SPLIT(info_batt_str,"<#CR>",FALSE,FALSE)
  1077. // FOR i = 0 TO (LENGTH(arry_info_batt) - 1)
  1078. // IF max_len < LENGTHB(arry_info_batt[i]) Then max_len = LENGTHB(arry_info_batt[i])
  1079. // NEXT
  1080. // tmpinfo_batt = ""
  1081. // FOR i = 0 TO (LENGTH(arry_info_batt) - 1)
  1082. // tmpinfo_batt = tmpinfo_batt + format(" ",max_len - LENGTHB(arry_info_batt[i]) ) + arry_info_batt[i] + "<#CR>"
  1083. // NEXT
  1084.  
  1085. //通常
  1086. tmpinfo_batt = info_batt_str
  1087.  
  1088. //表示位置決め
  1089. IFB tgl_log_full
  1090. // info_batt_x = tgl_log_clix + tgl_log_cliw - STATUS(info_batt_id,ST_WIDTH)
  1091. //コマンドウィンドウ基準
  1092. info_batt_x = tgl_log_clix + 30
  1093. info_batt_y = tgl_log_cliy + tgl_log_clih - info_batt_h - 260
  1094. info_batt_trans = -2
  1095. ELSE
  1096. info_batt_x = tgl_log_dqxx + tgl_log_dqxw
  1097. info_batt_y = info_sysm_y + info_sysm_h
  1098. info_batt_trans = 0
  1099. ENDIF
  1100.  
  1101. //2箇所の色をとって文字色切替
  1102. chkBG = 0
  1103. chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_R)
  1104. chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_G)
  1105. chkBG = chkBG + PEEKCOLOR(info_batt_x ,info_batt_y - info_batt_h,COL_B)
  1106. chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_R)
  1107. chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_G)
  1108. chkBG = chkBG + PEEKCOLOR(info_batt_x+50 ,info_batt_y - info_batt_h,COL_B)
  1109. chkBG = chkBG / 6
  1110. IFB chkBG < 128
  1111. colFG = $FFFFFF
  1112. ELSE
  1113. colFG = $000000
  1114. ENDIF
  1115.  
  1116. FUKIDASI( tmpinfo_batt ,info_batt_x,info_batt_y,0,8,"MS 明朝",colFG,$000001,info_batt_trans)
  1117. info_batt_h = STATUS(info_batt_id,ST_HEIGHT)
  1118. info_batt_w = STATUS(info_batt_id,ST_WIDTH)
  1119.  
  1120. Mutex.Unlock("info_batt_trd",info_batt_trd)
  1121. ELSE
  1122. info_batt_h = 0
  1123. info_batt_w = 0
  1124. FUKIDASI()
  1125. ENDIF
  1126.  
  1127. Sleep(0.1)
  1128. Wend
  1129. FEND
  1130.  
  1131.  
  1132. //デバッグログ出力
  1133. //YY/MM/DD HH:MM.ss ログ文字列
  1134. PROCEDURE Odbg(dbgstr)
  1135. IFB FDBG
  1136. fid = FOPEN(dbgpath, F_READ or F_WRITE)
  1137. GETTIME()
  1138. timestamp = G_TIME_YY + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + "." + G_TIME_SS2 + " "
  1139. FPUT(fid, timestamp + dbgstr )
  1140. FCLOSE(fid)
  1141. ENDIF
  1142. FEND
  1143.  
  1144. //DWORD値をANSI文字列に 4byte分のみ
  1145. FUNCTION dword2char(num)
  1146. tmpstr = FORMAT(num,8,-1)
  1147. 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))
  1148. RESULT = str
  1149. FEND
  1150.  
  1151. //配列をANSIとして文字変換
  1152. FUNCTION byte2ansi(byte_array[])
  1153. IFB true
  1154. MSGBOX("byte2ansi:未実装")
  1155. ExitExit
  1156. ELSE
  1157. MSGBOX("byte2ansi:未実装")
  1158. ExitExit
  1159. ENDIF
  1160. RESULT = "未実装"
  1161. Exit
  1162. FEND
  1163.  
  1164. //配列をUTF8として文字変換
  1165. //簡略化のため3Byte文字まで
  1166. FUNCTION byte2utf8(byte_array[])
  1167. // Odbg("byte2utf8 :" + LENGTH(byte_array) )
  1168. retstr = ""
  1169. tmpchr = 0
  1170. i = 0
  1171. WHILE i < LENGTH(byte_array) - 1
  1172. // Odbg("base:" + FORMAT(byte_array[i],2,-1) )
  1173. IFB (byte_array[i] and $E0) = $E0 //1110 0000
  1174. //3byte top
  1175. // Odbg("3byt:" + (byte_array[i] and $F) )//0000 1111
  1176. tmpchr = 0
  1177. tmpchr = tmpchr + (byte_array[i ] and $F ) * $1000 //0000 1111 0000 0000 0000 0000 →1111 00 0000 00 0000
  1178. tmpchr = tmpchr + (byte_array[i+1] and $3F) * $40 //0000 0000 0011 1111 0000 0000 →0000 11 1111 00 0000
  1179. tmpchr = tmpchr + (byte_array[i+2] and $3F) * $1 //0000 0000 0000 0000 0011 1111 →0000 00 0000 11 1111
  1180. // Odbg("orig:" + REPLACE(FORMAT(byte_array[i],2,-1) + FORMAT(byte_array[i+1],2,-1) + FORMAT(byte_array[i+2],2,-1)," ","0") )
  1181. // Odbg("code:" + tmpchr )
  1182. // Odbg("utf8:" + chr(tmpchr) )
  1183. retstr = retstr + chr(tmpchr)
  1184. i = i + 3
  1185. ELSEIF (byte_array[i] and $C0) = $C0 //1100 0000
  1186. //2byte top
  1187. // Odbg("2byt:" + (byte_array[i] and $1F) ) //0001 1111
  1188. tmpchr = 0
  1189. tmpchr = tmpchr + (byte_array[i ] and $1F) * $40 //0001 1111 0000 0000 →1 1111 00 0000
  1190. tmpchr = tmpchr + (byte_array[i+1] and $3F) * $1 //0000 0000 0011 1111 →0 0000 11 1111
  1191. retstr = retstr + chr(tmpchr)
  1192. i = i + 2
  1193. ELSEIF byte_array[i] = $00
  1194. //end of str
  1195. Break
  1196. ELSEIF (byte_array[i] and $00) = $00 //0000 0000
  1197. //1byte top
  1198. // Odbg("1byt:" + (byte_array[i] and $7F) ) //0111 1111
  1199. tmpchr = 0
  1200. tmpchr = tmpchr + (byte_array[i ] and $7F) * $1 //0111 1111 → 111 1111
  1201. retstr = retstr + chr(tmpchr)
  1202. i = i + 1
  1203. ELSE
  1204. Odbg("NG:UTF8")
  1205. i = i + 1
  1206. ENDIF
  1207. WEND
  1208. RESULT = retstr
  1209. Exit
  1210. FEND
  1211.  
  1212. //4byte配列をDword値として数値変換
  1213. FUNCTION byte2dword(byte_array[])
  1214. IFB 4 = LENGTH(byte_array)
  1215. tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 ) + (byte_array[2] * $10000 ) + (byte_array[3] * $1000000)
  1216. // Odbg("byte2dword :" + REPLACE(FORMAT(tmpnum,8,-1)," ","0") )
  1217. RESULT = tmpnum
  1218. Exit
  1219. ELSE
  1220. MSGBOX("byte2dword :配列数エラー:" + LENGTH(byte_array))
  1221. ExitExit
  1222. ENDIF
  1223. Exit
  1224. FEND
  1225.  
  1226. //2byte配列をword値として数値変換
  1227. FUNCTION byte2word(byte_array[])
  1228. IFB 2 = LENGTH(byte_array)
  1229. tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 )
  1230. // Odbg("byte2word :" + REPLACE(FORMAT(tmpnum,8,-1)," ","0") )
  1231. RESULT = tmpnum
  1232. Exit
  1233. ELSE
  1234. MSGBOX("byte2word :配列数エラー:" + LENGTH(byte_array))
  1235. ExitExit
  1236. ENDIF
  1237. Exit
  1238. FEND
  1239.  
  1240. //プロセス情報の更新行う
  1241. //戻り値 true:正常 false:起動してないっぽい
  1242. //uwscID取得後エラーは終了処理
  1243. FUNCTION processCHK()
  1244.  
  1245. //uwsc側ID取得
  1246. DqxWid = GETID("ドラゴンクエストX オンライン")
  1247. IFB -1 = DqxWid
  1248. RESULT = false
  1249. Exit
  1250. ENDIF
  1251.  
  1252. //ログ表示位置用
  1253. tgl_log_dqxx = STATUS(DqxWid,ST_X)
  1254. tgl_log_dqxy = STATUS(DqxWid,ST_Y)
  1255. tgl_log_dqxw = STATUS(DqxWid,ST_WIDTH)
  1256. tgl_log_dqxh = STATUS(DqxWid,ST_HEIGHT)
  1257.  
  1258. tgl_log_clix = STATUS(DqxWid,ST_CLX)
  1259. tgl_log_cliy = STATUS(DqxWid,ST_CLY)
  1260. tgl_log_cliw = STATUS(DqxWid,ST_CLWIDTH)
  1261. tgl_log_clih = STATUS(DqxWid,ST_CLHEIGHT)
  1262.  
  1263. DqxPid = 0
  1264.  
  1265. //uwscID→プロセスID
  1266. ret = GetWindowThreadProcessId(IDtoHND(DqxWid),DqxPid)
  1267. Odbg("dqxプロセスID :" + DqxPid)
  1268. Odbg("親スレッドID :" + ret)
  1269.  
  1270. //プロセスID→ASLR用ベースアドレス
  1271. hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, DqxPid)
  1272. Odbg("hModuleSnap :" + hModuleSnap)
  1273.  
  1274. dwSize = (4 * 8) + 256 + 260
  1275. th32ModuleID = 0
  1276. th32ProcessID = 0
  1277. GlblcntUsage = 0
  1278. ProccntUsage = 0
  1279. modBaseAddr = 0
  1280. modBaseSize = 0
  1281. hModule = 0
  1282. szModule = FORMAT(ChrB(0), 256)
  1283. szExePath = FORMAT(ChrB(0), 260)
  1284.  
  1285. ret = Module32First(hModuleSnap,dwSize,th32ModuleID,th32ProcessID,GlblcntUsage,ProccntUsage,modBaseAddr,modBaseSize,hModule,szModule,szExePath)
  1286. IF ret = false
  1287. MSGBOX("NG:Module32First")
  1288. ExitExit
  1289. ENDIF
  1290.  
  1291. //数値へ変換
  1292. dwSize = VAL(dwSize )
  1293. th32ModuleID = VAL(th32ModuleID )
  1294. th32ProcessID = VAL(th32ProcessID)
  1295. GlblcntUsage = VAL(GlblcntUsage )
  1296. ProccntUsage = VAL(ProccntUsage )
  1297. modBaseAddr = VAL(modBaseAddr )
  1298. modBaseSize = VAL(modBaseSize )
  1299. hModule = VAL(hModule )
  1300.  
  1301. Odbg("dwSize :" + dwSize )
  1302. Odbg("th32ModuleID :" + th32ModuleID )
  1303. Odbg("th32ProcessID :" + th32ProcessID )
  1304. Odbg("GlblcntUsage :" + GlblcntUsage )
  1305. Odbg("ProccntUsage :" + ProccntUsage )
  1306. Odbg("modBaseAddr :" + modBaseAddr )
  1307. Odbg("modBaseSize :" + modBaseSize )
  1308. Odbg("hModule :" + hModule )
  1309. Odbg("szModule :" + szModule )
  1310. Odbg("szExePath :" + szExePath )
  1311.  
  1312. DqxBaseAddr = modBaseAddr
  1313. Odbg("DqxBaseAddr :" + REPLACE(FORMAT(DqxBaseAddr,8,-1)," ","0") )
  1314.  
  1315. //プロセスID→ログベースアドレスの取得
  1316. DqxPhnd = OpenProcess(PROCESS_VM_READ, false, DqxPid);
  1317. Odbg("OpenProcessid :" + DqxPhnd )
  1318.  
  1319. RESULT = true
  1320. Exit
  1321. FEND
  1322.  
  1323. //LogBaseAddressの更新行う
  1324. //戻り値 true:正常 false:ログイン時かログがまだ無い場合
  1325. FUNCTION logBaseCHK()
  1326.  
  1327. // Odbg("logBase Search :" + REPLACE(FORMAT(DqxBaseAddr + logPO,8,-1)," ","0") )
  1328.  
  1329. buff_readcnt = 0
  1330. DIM buff_dword[ArryDwordSize - 1]
  1331. IFB false = ReadProcessMemory(DqxPhnd, DqxBaseAddr + logPO , buff_dword , 4, buff_readcnt)
  1332. Odbg("NG:ReadProcessMemory:logBaseCHK()" )
  1333. RESULT = false
  1334. Exit
  1335. ENDIF
  1336.  
  1337. now_logBA = byte2dword(buff_dword)
  1338.  
  1339. //0の場合はやり直し
  1340. IFB 0 = now_logBA
  1341. Odbg("logBA( ,new) :0")
  1342. logBA = now_logBA//リセットしておく
  1343. RESULT = false
  1344. Exit
  1345. ENDIF
  1346.  
  1347. //前回取得時と同じ場合はOK
  1348. IFB logBA = now_logBA
  1349. // Odbg("logBA(old,new) :" + logBA + "=" + now_logBA )
  1350. RESULT = true
  1351. Exit
  1352. ENDIF
  1353.  
  1354. Odbg("logBA Search :" + REPLACE(FORMAT(DqxBaseAddr + logPO,8,-1)," ","0") )
  1355. Odbg("logBA(old,new) :" + logBA + "<>" + now_logBA )
  1356.  
  1357. //更新処理
  1358. logBA = now_logBA
  1359.  
  1360. logBAsytm = logBA + logDOsytm
  1361. logBAchat = logBA + logDOchat
  1362. Odbg("logBA :" + REPLACE(FORMAT(logBA,8,-1)," ","0") )
  1363. Odbg("logBAsytm :" + REPLACE(FORMAT(logBAsytm,8,-1)," ","0") )
  1364. Odbg("logBAchat :" + REPLACE(FORMAT(logBAchat,8,-1)," ","0") )
  1365.  
  1366. RESULT = true
  1367. Exit
  1368. FEND
  1369.  
  1370. //StatusBaseAddressの更新行う
  1371. //戻り値 true:正常 false:ログイン時かログがまだ無い場合
  1372. FUNCTION staBaseCHK()
  1373.  
  1374. // Odbg("staBase Search :" + REPLACE(FORMAT(DqxBaseAddr + staPO,8,-1)," ","0") )
  1375.  
  1376. buff_readcnt = 0
  1377. DIM buff_dword[ArryDwordSize - 1]
  1378. IFB false = ReadProcessMemory(DqxPhnd, DqxBaseAddr + staPO , buff_dword , 4, buff_readcnt)
  1379. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1380. RESULT = false
  1381. Exit
  1382. ENDIF
  1383.  
  1384. now_staBA = byte2dword(buff_dword)
  1385.  
  1386. //0の場合はやり直し
  1387. IFB 0 = now_staBA
  1388. Odbg("staBA( ,new) :0")
  1389. staBA = now_staBA//リセットしておく
  1390. RESULT = false
  1391. Exit
  1392. ENDIF
  1393.  
  1394. //前回取得時と同じ場合はOK
  1395. IFB staBA = now_staBA
  1396. // Odbg("staBA(old,new) :" + staBA + "=" + now_staBA )
  1397. RESULT = true
  1398. Exit
  1399. ENDIF
  1400.  
  1401. Odbg("staBA Search :" + REPLACE(FORMAT(DqxBaseAddr + staPO,8,-1)," ","0") )
  1402. Odbg("staBA(old,new) :" + staBA + "<>" + now_staBA )
  1403.  
  1404. //更新処理
  1405. staBA = now_staBA
  1406.  
  1407. Odbg("staBA :" + REPLACE(FORMAT(staBA,8,-1)," ","0") )
  1408.  
  1409. RESULT = true
  1410. Exit
  1411. FEND
  1412.  
  1413.  
  1414. //システムログメモリデータの取得整形(tmp配列の為結合)
  1415. PROCEDURE GetSlogMemFormat()
  1416. timer_slogm = GETTIME() * 1000 + G_TIME_ZZ
  1417.  
  1418.  
  1419. Mutex.Lock(info_slog_trd)
  1420.  
  1421. //処理前に要らないデータは消しておく
  1422. //
  1423. delnum = Length(syslog_wflg) - 700//クライアント保持分 686 = 24731:MAXサイズ / (4:id + 1:type + 1:len + 30:大体10文字分)
  1424. IF delnum < 0 then delnum = 0//少ない場合
  1425. i = 0
  1426. //ログ通番でソートされているので 古いものから削除
  1427. WHILE i < delnum
  1428. //delnum分先頭を削除処理
  1429. delkey = syslog_wflg[0, HASH_KEY]
  1430. IFB syslog_wflg[delkey, HASH_EXISTS] = false OR syslog_bflg[delkey, HASH_EXISTS] = false
  1431. Odbg("HashNG_sw:" + syslog_wflg[delkey, HASH_EXISTS])
  1432. Odbg("HashNG_sb:" + syslog_bflg[delkey, HASH_EXISTS])
  1433. ELSE
  1434. IFB 1 = syslog_wflg[delkey] AND 1 = syslog_bflg[delkey] //保存済み&処理済み のみ削除対象
  1435. ret = syslog_time[delkey, HASH_REMOVE]
  1436. ret = syslog_type[delkey, HASH_REMOVE]
  1437. ret = syslog_str[ delkey, HASH_REMOVE]
  1438. ret = syslog_wflg[delkey, HASH_REMOVE]
  1439. ret = syslog_bflg[delkey, HASH_REMOVE]
  1440. ENDIF
  1441. ENDIF
  1442. i = i + 1
  1443. WEND
  1444.  
  1445. Mutex.Unlock("info_slog_trd",info_slog_trd)
  1446.  
  1447. // logSystmSta = 0 //システムログ開始アドレス
  1448. // logSystmEnd = 0 //システムログ終了アドレス
  1449.  
  1450. DIM tmp_dword[ArryDwordSize - 1]
  1451. DIM buff_slog[ArrySlogSize - 1]
  1452.  
  1453. buff_readcnt = 0 //読み込みバイト数
  1454. IFB false = ReadProcessMemory(DqxPhnd, logBAsytm - 8 , tmp_dword , 4, buff_readcnt)
  1455. MSGBOX("NG:ReadProcessMemory") ; ExitExit
  1456. ENDIF
  1457. tmplogSystmSta = byte2dword(tmp_dword)
  1458.  
  1459. buff_readcnt = 0
  1460. IFB false = ReadProcessMemory(DqxPhnd, logBAsytm - 4 , tmp_dword , 4, buff_readcnt)
  1461. MSGBOX("NG:ReadProcessMemory") ; ExitExit
  1462. ENDIF
  1463. tmplogSystmEnd = byte2dword(tmp_dword)
  1464.  
  1465. //アドレス未変更時は処理しない
  1466. IFB logSystmSta = tmplogSystmSta AND logSystmEnd = tmplogSystmEnd
  1467. timer_slogm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogm
  1468. timer_slogf = 0
  1469. Exit
  1470. ELSE
  1471. logSystmSta = tmplogSystmSta
  1472. logSystmEnd = tmplogSystmEnd
  1473. ENDIF
  1474.  
  1475. //変更されているので読込み
  1476. buff_readcnt = 0
  1477. IFB false = ReadProcessMemory(DqxPhnd, logBAsytm , buff_slog , ArrySlogSize, buff_readcnt)
  1478. MSGBOX("NG:ReadProcessMemory") ; ExitExit
  1479. ENDIF
  1480.  
  1481. timer_slogm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogm
  1482.  
  1483. timer_slogf = GETTIME() * 1000 + G_TIME_ZZ
  1484.  
  1485. Mutex.Lock(info_slog_trd)
  1486.  
  1487. //システムログデータ整形
  1488. //開始アドレスが指定されている 場合は 開始アドレス→最終アドレス + 基底アドレス→終了アドレス
  1489. //開始アドレスが指定されていない場合は 基底アドレス→終了アドレス
  1490. //開始アドレスが指定されている
  1491. IFB logSystmSta <> $0
  1492. // Odbg(logSystmSta + "-" + ArrySlogSize)
  1493. i = logSystmSta
  1494. WHILE i < (ArrySlogSize - 1 - 8) //ID+type+Len+str 4+1+1+2 8byteは必要
  1495. // Odbg(i + "/" + ArrySlogSize)
  1496. slogID = byte2dword( SLICE(buff_slog,i,i+3) )
  1497. IF slogID = $0 THEN Break
  1498. //slogID妥当性チェック
  1499. IFB slogIdLast = 0
  1500. slogIdLast = slogID
  1501. ELSEIF slogID = ( slogIdLast + 1 )
  1502. slogIdLast = slogID
  1503. ELSEIF slogID < ( slogIdLast + 2048)
  1504. // print "1oldIDx :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0")
  1505. // print "1nowIDx :" + REPLACE(FORMAT(slogID,8,-1)," ","0")
  1506. slogIdLast = slogID
  1507. ELSE
  1508. Odbg("1oldID :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0") )
  1509. Odbg("1nowID :" + REPLACE(FORMAT(slogID,8,-1)," ","0") )
  1510. Odbg("1slogaddr:" + REPLACE(FORMAT(logBAsytm + i,8,-1)," ","0") )
  1511. Odbg("1slogSta :" + REPLACE(FORMAT(logBAsytm + logSystmSta,8,-1)," ","0") )
  1512. Odbg("1slogEnd :" + REPLACE(FORMAT(logBAsytm + logSystmEnd,8,-1)," ","0") )
  1513. break
  1514. ENDIF
  1515. slogID = REPLACE(FORMAT(slogID,8,-1)," ","0")
  1516. slogLen = buff_slog[i+5]
  1517. IF slogLen = 0 THEN break //deadlock回避
  1518. IFB syslog_wflg[slogID, HASH_EXISTS] //保存済みは飛ばす
  1519. i = i + slogLen
  1520. Continue
  1521. ENDIF
  1522. slogTyp = buff_slog[i+4]
  1523. slogStr = ""
  1524. slogStr = byte2utf8( SLICE(buff_slog,i+6,i+slogLen) )
  1525. // Odbg( _
  1526. // slogID + ":" + _
  1527. // FORMAT(slogTyp,3) + ":" + _
  1528. // FORMAT(slogLen,3) + ":" + _
  1529. // slogStr )
  1530. //格納
  1531. GETTIME()
  1532. syslog_time[slogID] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
  1533. syslog_type[slogID] = slogTyp
  1534. syslog_str[slogID] = slogStr
  1535. syslog_wflg[slogID] = 0
  1536. syslog_bflg[slogID] = 0
  1537. i = i + slogLen
  1538. WEND
  1539. ENDIF
  1540.  
  1541. //基底アドレス→終了アドレス
  1542. i = 0
  1543. WHILE i < (logSystmEnd - 1 - 8) //ID+type+Len+str 4+1+1+1 7byteは必要
  1544. slogID = byte2dword( SLICE(buff_slog,i,i+3) )
  1545. IF slogID = $0 THEN Break
  1546. //slogID妥当性チェック
  1547. IFB slogIdLast = 0
  1548. slogIdLast = slogID
  1549. ELSEIF slogID = ( slogIdLast + 1 )
  1550. slogIdLast = slogID
  1551. ELSEIF slogID < ( slogIdLast + 2048 )
  1552. // print "2oldIDx :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0")
  1553. // print "2nowIDx :" + REPLACE(FORMAT(slogID,8,-1)," ","0")
  1554. slogIdLast = slogID
  1555. ELSE
  1556. Odbg("2oldID :" + REPLACE(FORMAT(slogIdLast,8,-1)," ","0") )
  1557. Odbg("2nowID :" + REPLACE(FORMAT(slogID,8,-1)," ","0") )
  1558. Odbg("2slogaddr:" + REPLACE(FORMAT(logBAsytm + i,8,-1)," ","0") )
  1559. Odbg("2slogSta :" + REPLACE(FORMAT(logBAsytm + logSystmSta,8,-1)," ","0") )
  1560. Odbg("2slogEnd :" + REPLACE(FORMAT(logBAsytm + logSystmEnd,8,-1)," ","0") )
  1561. break
  1562. ENDIF
  1563. slogID = REPLACE(FORMAT(slogID,8,-1)," ","0")
  1564. slogLen = buff_slog[i+5]
  1565. IF slogLen = 0 THEN break //deadlock回避
  1566. IFB syslog_wflg[slogID, HASH_EXISTS] //保存済みは飛ばす
  1567. i = i + slogLen
  1568. Continue
  1569. ENDIF
  1570. slogTyp = buff_slog[i+4]
  1571. slogStr = ""
  1572. slogStr = byte2utf8( SLICE(buff_slog,i+6,i+slogLen) )
  1573. //格納
  1574. GETTIME()
  1575. syslog_time[slogID] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
  1576. syslog_type[slogID] = slogTyp
  1577. syslog_str[slogID] = slogStr
  1578. syslog_wflg[slogID] = 0
  1579. syslog_bflg[slogID] = 0
  1580. i = i + slogLen
  1581. WEND
  1582.  
  1583. info_slog_keep = Length(syslog_wflg)
  1584.  
  1585. Mutex.Unlock("info_slog_trd",info_slog_trd)
  1586.  
  1587. timer_slogf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogf
  1588. FEND
  1589.  
  1590. //システムログメモリデータの表示
  1591. PROCEDURE GetSlogPrint()
  1592. timer_slogp = GETTIME() * 1000 + G_TIME_ZZ
  1593.  
  1594. Mutex.Lock(info_slog_trd)
  1595.  
  1596. //表示分のみ処理
  1597. info_slog_str = ""
  1598.  
  1599. i = Length(syslog_wflg) - 1 - info_slog_max
  1600. IF i < 0 then i = 0//MAXより少ない場合
  1601. WHILE i < Length(syslog_wflg)
  1602. info_slog_str = info_slog_str + _
  1603. syslog_wflg[i,HASH_VAL] + ":" + _
  1604. syslog_bflg[i,HASH_VAL] + ":" + _
  1605. syslog_wflg[i,HASH_KEY] + ":" + _
  1606. syslog_time[i,HASH_VAL] + ":" + _
  1607. syslog_type[i,HASH_VAL] + ":" + _
  1608. syslog_str[i,HASH_VAL] + "<#CR>"
  1609. i = i + 1
  1610. Wend
  1611.  
  1612. Mutex.Unlock("info_slog_trd",info_slog_trd)
  1613.  
  1614. timer_slogp = (GETTIME() * 1000 + G_TIME_ZZ) - timer_slogp
  1615. FEND
  1616.  
  1617. //チャットログメモリデータの取得整形(tmp配列の為結合)
  1618. PROCEDURE GetChatMemFormat()
  1619. timer_chatm = GETTIME() * 1000 + G_TIME_ZZ
  1620.  
  1621. Mutex.Lock(info_chat_trd)
  1622.  
  1623. //処理前に要らないデータは消しておく
  1624. delnum = Length(chtlog_wflg) - 200//クライアント保持分 180
  1625. IF delnum < 0 then delnum = 0//少ない場合
  1626. i = 0
  1627. WHILE i < delnum
  1628. //delnum分先頭を削除処理
  1629. delkey = chtlog_wflg[0, HASH_KEY]
  1630. IFB chtlog_wflg[delkey, HASH_EXISTS] = false
  1631. Odbg("HashNG_cw:" + chtlog_wflg[delkey, HASH_EXISTS])
  1632. ELSE
  1633. // //保存済みのみ削除対象 先頭50個に保存されていた場合は削除しない
  1634. // IFB 1 = chtlog_wflg[delkey] AND chtlog_head[delkey, HASH_EXISTS] = false
  1635. ret = chtlog_wflg[ delkey, HASH_REMOVE]
  1636. ret = chtlog_time[ delkey, HASH_REMOVE]
  1637. ret = chtlog_srcid[delkey, HASH_REMOVE]
  1638. ret = chtlog_desid[delkey, HASH_REMOVE]
  1639. ret = chtlog_tmp[ delkey, HASH_REMOVE]
  1640. ret = chtlog_room[ delkey, HASH_REMOVE]
  1641. ret = chtlog_src[ delkey, HASH_REMOVE]
  1642. ret = chtlog_des[ delkey, HASH_REMOVE]
  1643. ret = chtlog_str[ delkey, HASH_REMOVE]
  1644. // ENDIF
  1645. ENDIF
  1646. i = i + 1
  1647. WEND
  1648.  
  1649. DIM buff_chat[ArryChatSize - 1]
  1650. buff_readcnt = 0
  1651. IFB false = ReadProcessMemory(DqxPhnd, logBAchat , buff_chat , ArryChatSize, buff_readcnt)
  1652. MSGBOX("NG:ReadProcessMemory") ; ExitExit
  1653. ENDIF
  1654.  
  1655. timer_chatm = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatm
  1656.  
  1657. timer_chatf = GETTIME() * 1000 + G_TIME_ZZ
  1658.  
  1659. //チャットログデータ整形
  1660. //(180 * 180) + (4 * 180)
  1661. //表示順で最後から処理し
  1662. //Chat通番が0は飛ばす 保存済みが出たら終了
  1663. //
  1664. FOR i = (180 * 180) + (4 * 180) - 4 TO (180 * 180) STEP -4
  1665. //格納位置 = 表示順アドレス - ベースアドレス
  1666. readNum = byte2dword(SLICE(buff_chat,i,i+3)) - logBAchat
  1667.  
  1668. //チャット通番で処理
  1669. chatNum = byte2dword(SLICE(buff_chat,readNum + 8,readNum+11))
  1670. //0は飛ばす
  1671. IFB chatNum = 0
  1672. Continue
  1673. ENDIF
  1674. //保存済みで終了
  1675. chatNum = REPLACE(FORMAT(chatNum,8,-1)," ","0")
  1676. IFB chtlog_time[chatNum, HASH_EXISTS]
  1677. Break
  1678. ENDIF
  1679.  
  1680. //元キャラID 先キャラID Chat通番 何か? ルーム番号? 元キャラ名 先キャラ名 Chat上段 下段
  1681. //4byte 4 4 4 4 19 19 61 61
  1682. charSrcid = byte2charid(SLICE(buff_chat,readNum+ 0,readNum+ 3))
  1683. charDesid = byte2charid(SLICE(buff_chat,readNum+ 4,readNum+ 7))
  1684. chattmp = byte2dword(SLICE(buff_chat,readNum+12,readNum+15))
  1685. chattmp = REPLACE(FORMAT(chattmp,8,-1)," ","0")
  1686. chatroom = byte2dword(SLICE(buff_chat,readNum+16,readNum+19))
  1687. chatroom = REPLACE(FORMAT(chatroom,8,-1)," ","0")
  1688.  
  1689. charSrc = byte2utf8( SLICE(buff_chat,readNum+20+0 ,readNum+20+ 0+18) )
  1690. charDes = byte2utf8( SLICE(buff_chat,readNum+20+19,readNum+20+19+18) )
  1691.  
  1692. //キャラ名をそろえる為にパディング
  1693. paddname_src = format(" ",12 - LENGTHB(charSrc)) + charSrc
  1694. paddname_des = format(" ",12 - LENGTHB(charDes)) + charDes
  1695.  
  1696. chatU = byte2utf8( SLICE(buff_chat,readNum+20+38,readNum+20+38+60) )
  1697. chatD = byte2utf8( SLICE(buff_chat,readNum+20+99,readNum+20+99+60) )
  1698.  
  1699. //格納
  1700. GETTIME()
  1701. chtlog_time[chatNum] = G_TIME_YY+"/"+G_TIME_MM2+"/"+G_TIME_DD2+"_"+G_TIME_HH2+":"+G_TIME_NN2+"."+G_TIME_SS2
  1702. chtlog_srcid[chatNum] = charSrcid
  1703. chtlog_desid[chatNum] = charDesid
  1704. chtlog_tmp[chatNum] = chattmp
  1705. chtlog_room[chatNum] = chatroom
  1706. // chtlog_src[chatNum] = charSrc
  1707. // chtlog_des[chatNum] = charDes
  1708. chtlog_src[chatNum] = paddname_src
  1709. chtlog_des[chatNum] = paddname_des
  1710. chtlog_str[chatNum] = chatU + chatD
  1711. chtlog_wflg[chatNum] = 0
  1712.  
  1713.  
  1714. // IF false THEN Odbg( _
  1715. // chatNum + ":" + _
  1716. // charInfoA + ":" + _
  1717. // charInfoB + ":" + _
  1718. // chattmp + ":" + _
  1719. // chatroom + ":" + _
  1720. // FORMAT(" ",12 - LENGTHB(charNameA)) + charNameA + ":" + _
  1721. // FORMAT(" ",12 - LENGTHB(charNameB)) + charNameB + ":" + _
  1722. // FORMAT(" ",20 - LENGTHB(chatU)) + chatU + ":" + _
  1723. // FORMAT(" ",20 - LENGTHB(chatD)) + chatD )
  1724. next
  1725.  
  1726. info_chat_keep = Length(chtlog_wflg)
  1727.  
  1728. Mutex.Unlock("info_chat_trd",info_chat_trd)
  1729.  
  1730. timer_chatf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatf
  1731. FEND
  1732.  
  1733. //チャットログメモリデータの表示
  1734. PROCEDURE GetChatPrint()
  1735. timer_chatp = GETTIME() * 1000 + G_TIME_ZZ
  1736. //表示分のみ処理
  1737.  
  1738. Mutex.Lock(info_chat_trd)
  1739.  
  1740. info_chat_str = ""
  1741.  
  1742. i = Length(chtlog_wflg) - 1 - info_chat_max
  1743. IF i < 0 then i = 0//MAXより少ない場合
  1744. WHILE i < Length(chtlog_wflg)
  1745. info_chat_str = info_chat_str + _
  1746. chtlog_wflg[i,HASH_VAL] + ":" + _
  1747. chtlog_wflg[i,HASH_KEY] + ":" + _
  1748. chtlog_time[i,HASH_VAL] + ":" + _
  1749. chtlog_srcid[i,HASH_VAL] + ":" + _
  1750. chtlog_desid[i,HASH_VAL] + ":" + _
  1751. chtlog_tmp[i,HASH_VAL] + ":" + _
  1752. chtlog_room[i,HASH_VAL] + ":" + _
  1753. chtlog_src[i,HASH_VAL] + ":" + _
  1754. chtlog_des[i,HASH_VAL] + ":" + _
  1755. chtlog_str[i,HASH_VAL] + "<#CR>"
  1756. i = i + 1
  1757. WEND
  1758.  
  1759. Mutex.Unlock("info_chat_trd",info_chat_trd)
  1760.  
  1761. timer_chatp = (GETTIME() * 1000 + G_TIME_ZZ) - timer_chatp
  1762. FEND
  1763.  
  1764. //討伐売りデータの整形
  1765. PROCEDURE sellFormat()
  1766. timer_sellf = GETTIME() * 1000 + G_TIME_ZZ
  1767.  
  1768. Mutex.Lock(info_chat_trd)
  1769. Mutex.Lock(info_sell_trd)
  1770.  
  1771. //チャット保持分のみにする
  1772. cell_data = HASH_REMOVEALL
  1773.  
  1774. //チャットデータから整形
  1775. for i = 0 TO Length(chtlog_str) - 1
  1776. // IFB info_sell_last < VAL("$" + chtlog_str[i,HASH_KEY])//最終処理分より後ろのみ処理
  1777. srcstr = chtlog_str[i,HASH_VAL]
  1778. sname = chtlog_src[i,HASH_VAL]
  1779. tmpstr = srcstr
  1780. numflg = false
  1781. //小文字 カタカナ 半角に統一
  1782. tmpstr = STRCONV(tmpstr,SC_LOWERCASE)
  1783. tmpstr = STRCONV(tmpstr,SC_KATAKANA)
  1784. tmpstr = STRCONV(tmpstr,SC_HALFWIDTH)
  1785. tmpstr = regReplace(tmpstr,"([0-9]+)(p|g)|([0-9]+)",",$1$2$3,")
  1786. //数値検出 3文字以上
  1787. IF regTest(tmpstr,"[0-9]{3}") Then numflg = true
  1788. //確認除去
  1789. IF 0 <> POS("人",tmpstr,1) Then numflg = false
  1790. IF 0 <> POS("名",tmpstr,1) Then numflg = false
  1791.  
  1792. //数値有りのみ処理
  1793. IFB numflg
  1794. //数値有り
  1795. //区切りっぽいものを統一
  1796. tmpstr = REPLACE(tmpstr, " ", ",")
  1797. tmpstr = REPLACE(tmpstr, "/", ",")
  1798. tmpstr = REPLACE(tmpstr, "・", ",")
  1799. //分割
  1800. tmparry = SPLIT(tmpstr,",")
  1801. //選別
  1802. tmp_p = ""
  1803. tmp_g = ""
  1804. tmp_nan = ""
  1805. for i = 0 TO Length(tmparry) - 1
  1806. IFB 0 <> POS("p",tmparry[i],-1)
  1807. tmp_p = tmparry[i]
  1808. ELSEIF 0 <> POS("g",tmparry[i],-1)
  1809. tmp_g = tmparry[i]
  1810. ELSEIF ERR_VALUE <> VAL(tmparry[i]) AND 4 < LENGTH(tmparry[i])
  1811. tmp_p = tmparry[i] + "p"
  1812. ELSEIF ERR_VALUE <> VAL(tmparry[i]) AND 2 < LENGTH(tmparry[i])
  1813. tmp_g = tmparry[i] + "g"
  1814. ELSE
  1815. tmp_nan = tmp_nan + tmparry[i] + " "
  1816. ENDIF
  1817. next
  1818. //パディングして格納
  1819. tmpstr = ""
  1820. tmpget = VAL(COPY(tmp_p,1,lengthB(tmp_p)-1)) - VAL(COPY(tmp_g,1,lengthB(tmp_g)-1))
  1821. tmpstr = tmpstr + format(" ",10 - lengthB(tmpget ) ) + tmpget + "get:"
  1822. tmpstr = tmpstr + format(" ",10 - lengthB(tmp_p ) ) + tmp_p + ":"
  1823. tmpstr = tmpstr + format(" ",10 - lengthB(tmp_g ) ) + tmp_g + ":"
  1824. tmpstr = tmpstr + format(" ",40 - lengthB(tmp_nan) ) + tmp_nan + ":"
  1825. tmpstr = tmpstr + sname + ":"
  1826. tmpstr = tmpstr + srcstr
  1827. //同一は纏める&ポイントとゴールドで並べる
  1828. cell_data[tmpget + tmp_p + tmp_g + srcstr] = tmpstr
  1829. ENDIF
  1830. //最終処理通番更新
  1831. info_sell_last = VAL("$" + chtlog_str[i,HASH_KEY])
  1832. // ENDIF
  1833. next
  1834.  
  1835. //表示用
  1836. // 1234567890get:1234567890:1234567890:1234567890123456789012345678901234567890:123456789012:
  1837. info_sell_str = " 差額: ポイント: ゴールド: 未検知文字列: キャラ名:元文字列" + "<#CR>"
  1838. for i = 0 TO Length(cell_data) - 1
  1839. info_sell_str = info_sell_str + cell_data[i,HASH_VAL] + "<#CR>"
  1840. next
  1841.  
  1842. Mutex.Unlock("info_chat_trd",info_chat_trd)
  1843. Mutex.Unlock("info_sell_trd",info_sell_trd)
  1844.  
  1845. timer_sellf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_sellf
  1846. FEND
  1847.  
  1848.  
  1849. //Statusメモリデータの取得整形
  1850. FUNCTION GetStatusMemFormat()
  1851. timer_stamf = GETTIME() * 1000 + G_TIME_ZZ
  1852.  
  1853. DIM buff_dword[ArryDwordSize - 1]
  1854. DIM buff_word[ArryWordSize - 1]
  1855. DIM buff_cname[(6*3)+1]//6文字*MAX3byte + 終端
  1856.  
  1857.  
  1858. //new(3.1.5b~)
  1859. //staBA + $20F8 → 人数(n)
  1860. //staBA + $20E0 + (n-1)*4byte → キャラステータス格納アドレス
  1861. //charBA(n) + $60 → キャラクター名
  1862. //charBA(n) + $84 → キャラクタID(サポは$00000000)
  1863. //charBA(n) + $95 → 職種類
  1864. //charBA(n) + $96 → LV
  1865. //charBA(n) + $AC → HPmax
  1866. //charBA(n) + $AE → MPmax
  1867. //charBA(n) + $B0 → HPnow
  1868. //charBA(n) + $B2 → MPnow
  1869.  
  1870. //キャラクター数の取得
  1871. buff_readcnt = 0
  1872. IFB false = ReadProcessMemory(DqxPhnd, staBA + $20F8 , buff_dword , 4, buff_readcnt)
  1873. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1874. RESULT = false
  1875. Exit
  1876. ENDIF
  1877.  
  1878. charMax = byte2dword(buff_dword)
  1879. // Odbg("staCharMax :" + REPLACE(FORMAT(charMax,8,-1)," ","0") )
  1880.  
  1881. //初期化
  1882. sta_name = HASH_REMOVEALL
  1883. sta_job = HASH_REMOVEALL
  1884. sta_lv = HASH_REMOVEALL
  1885. sta_hpmax = HASH_REMOVEALL
  1886. sta_mpmax = HASH_REMOVEALL
  1887. sta_hpnow = HASH_REMOVEALL
  1888. sta_mpnow = HASH_REMOVEALL
  1889.  
  1890. //人数分Statusの取得
  1891. for i=0 TO charMax - 1
  1892.  
  1893. //Status格納アドレスの取得
  1894. buff_readcnt = 0
  1895. IFB false = ReadProcessMemory(DqxPhnd, staBA + $20E0 + (i*4) , buff_dword , 4, buff_readcnt)
  1896. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1897. RESULT = false
  1898. Exit
  1899. ENDIF
  1900.  
  1901. charAddr = byte2dword(buff_dword)
  1902. // Odbg("staChar(" + (i+1) + "/" + charMax + ")Addr:" + REPLACE(FORMAT(charAddr,8,-1)," ","0") )
  1903.  
  1904. //キャラクター名の取得
  1905. buff_readcnt = 0
  1906. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $60 , buff_cname , 19, buff_readcnt)
  1907. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1908. RESULT = false
  1909. Exit
  1910. ENDIF
  1911. sta_name[i] = byte2utf8( buff_cname )
  1912.  
  1913. //キャラクターIDの取得
  1914. buff_readcnt = 0
  1915. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $84 , buff_dword , 4, buff_readcnt)
  1916. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1917. RESULT = false
  1918. Exit
  1919. ENDIF
  1920. sta_id[i] = byte2charid(buff_dword)
  1921. sta_id[i] = COPY(sta_id[i],1,5) + "-" + COPY(sta_id[i],6)
  1922.  
  1923. //職種類の取得
  1924. buff_readcnt = 0
  1925. buff_jobnum = 0
  1926. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $95 , buff_jobnum , 1, buff_readcnt)
  1927. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1928. RESULT = false
  1929. Exit
  1930. ENDIF
  1931. sta_job[i] = Job_name[buff_jobnum]
  1932.  
  1933. //LVの取得
  1934. buff_readcnt = 0
  1935. buff_lvnum = 0
  1936. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $96 , buff_lvnum , 1, buff_readcnt)
  1937. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1938. RESULT = false
  1939. Exit
  1940. ENDIF
  1941. sta_lv[i] = buff_lvnum
  1942.  
  1943. //HP最大値の取得
  1944. buff_readcnt = 0
  1945. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $AC , buff_word , 2, buff_readcnt)
  1946. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1947. RESULT = false
  1948. Exit
  1949. ENDIF
  1950. sta_hpmax[i] = byte2word(buff_word)
  1951.  
  1952. //MP最大値の取得
  1953. buff_readcnt = 0
  1954. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $AE , buff_word , 2, buff_readcnt)
  1955. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1956. RESULT = false
  1957. Exit
  1958. ENDIF
  1959. sta_mpmax[i] = byte2word(buff_word)
  1960.  
  1961. //HP現在値の取得
  1962. buff_readcnt = 0
  1963. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $B0 , buff_word , 2, buff_readcnt)
  1964. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1965. RESULT = false
  1966. Exit
  1967. ENDIF
  1968. sta_hpnow[i] = byte2word(buff_word)
  1969.  
  1970. //MP現在値の取得
  1971. buff_readcnt = 0
  1972. IFB false = ReadProcessMemory(DqxPhnd, charAddr + $B2 , buff_word , 2, buff_readcnt)
  1973. Odbg("NG:ReadProcessMemory:staBaseCHK()" )
  1974. RESULT = false
  1975. Exit
  1976. ENDIF
  1977. sta_mpnow[i] = byte2word(buff_word)
  1978.  
  1979. next
  1980.  
  1981. timer_stamf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_stamf
  1982. RESULT = true
  1983. FEND
  1984.  
  1985. //戦闘データの整形
  1986. PROCEDURE battFormat()
  1987.  
  1988. //ステータス情報の取得
  1989. IFB GetStatusMemFormat()
  1990. //取得OK
  1991. ELSE
  1992. //取得NG
  1993. Exit
  1994. ENDIF
  1995.  
  1996. timer_battf = GETTIME() * 1000 + G_TIME_ZZ
  1997.  
  1998. Mutex.Lock(info_slog_trd)
  1999. Mutex.Lock(info_batt_trd)
  2000.  
  2001. // batt_data = HASH_REMOVEALL
  2002.  
  2003. //表示分のみ処理
  2004. // info_slog_str = ""
  2005. info_batt_str = ""
  2006.  
  2007. i = 0
  2008. WHILE i < Length(syslog_bflg)
  2009. IFB syslog_bflg[i,HASH_VAL] = 0//処理した分は読まない
  2010. tmpkey = syslog_bflg[i,HASH_KEY]
  2011. syslog_bflg[tmpkey] = 1
  2012.  
  2013. //比較用
  2014. tmpstr = syslog_str[i,HASH_VAL]
  2015.  
  2016. //戦闘開始 終了
  2017. //[モンスター名]と 戦闘開始!
  2018. //\s[キャラ名]\m[キャラID]\eが [モンスター名]たちと 戦闘開始!
  2019. //\s[キャラ名]\m[キャラID]\eが 戦闘に参加した!
  2020. //\s[キャラ名]\m[キャラID]\eは 戦うのをやめた。
  2021. //\s[キャラ名]\m[キャラID]\eは [モンスター名]たちを やっつけた!
  2022. IFB batt_sta_id = 0
  2023. IFB 0 <> POS("戦闘開始!",tmpstr,-1) OR _
  2024. ( 0 <> POS(sta_id[0,HASH_VAL],tmpstr,-1) AND 0 <> POS("戦闘に参加した!",tmpstr,-1) )
  2025. batt_sta_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
  2026. // batt_data = HASH_REMOVEALL
  2027. //キャスト時間のリセット
  2028. castm = HASH_REMOVEALL
  2029. batt_end_id = 0
  2030. i = i + 1
  2031. Continue
  2032. ENDIF
  2033. ELSE
  2034. IFB 0 <> POS("やっつけた!",tmpstr,-1) OR _
  2035. 0 <> POS("いなくなった!",tmpstr,-1) OR _
  2036. 0 <> POS("ぜんめつした。",tmpstr,-1) OR _
  2037. ( 0 <> POS("戦いをやめた。",tmpstr,-1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,-1) )
  2038. batt_end_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
  2039. batt_sta_id = 0
  2040. //キャスト時間のリセット
  2041. castm = HASH_REMOVEALL
  2042. //バフのリセット
  2043. for i=0 TO length(buff2_name) - 1
  2044. for j=0 TO 5 - 1
  2045. buff2_rank[i][j] = 0
  2046. next
  2047. next
  2048. for i=0 TO length(buff1a_stas) - 1
  2049. for j=0 TO 5 - 1
  2050. buff1a_rank[i][j] = 0
  2051. next
  2052. next
  2053. for i=0 TO length(buff1b_stas) - 1
  2054. for j=0 TO 5 - 1
  2055. buff1b_rank[i][j] = 0
  2056. next
  2057. next
  2058. i = i + 1
  2059. Continue
  2060. ENDIF
  2061. ENDIF
  2062.  
  2063. //未開始ログは読まない
  2064. IFB batt_sta_id = 0
  2065. i = i + 1
  2066. Continue
  2067. ENDIF
  2068.  
  2069. batt_tmp_id = VAL( "$" + syslog_str[i,HASH_KEY] ,0)
  2070.  
  2071. //終了後ログは読まない
  2072. IFB batt_end_id <> 0 AND batt_tmp_id > batt_end_id
  2073. i = i + 1
  2074. Continue
  2075. ENDIF
  2076.  
  2077. //バフのリセット
  2078. // → \s[キャラ名]\m[キャラID]\eは しんでしまった。
  2079. IFB 0 <> POS("しんでしまった。",tmpstr,-1)
  2080. charNo = -1
  2081. for tmpCharNo=0 TO length(sta_name) - 1
  2082. //IDで検索 優先
  2083. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2084. charNo = tmpCharNo
  2085. Break
  2086. ENDIF
  2087. //名前で検索 サポ名が同じ場合はかぶる
  2088. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2089. charNo = tmpCharNo
  2090. Break
  2091. ENDIF
  2092. next
  2093. IFB charNo = -1
  2094. //仲間キャラ以外(モンスターのログ)
  2095. break //buffNoスキップ & 次のログへ
  2096. ENDIF
  2097. //リセット
  2098. for i=0 TO length(buff2_name) - 1
  2099. buff2_rank[i][charNo] = 0
  2100. next
  2101. for i=0 TO length(buff1a_stas) - 1
  2102. buff1a_rank[i][charNo] = 0
  2103. next
  2104. for i=0 TO length(buff1b_stas) - 1
  2105. buff1b_rank[i][charNo] = 0
  2106. next
  2107. i = i + 1
  2108. Continue //次のログへ
  2109. ENDIF
  2110.  
  2111. //自前用キャストタイム 使用可チェック
  2112. IFB 0 <> POS(" 使えるようになった!",tmpstr,-1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
  2113. //★は むげんのさとりが 使えるようになった!
  2114. //★は イオグランデが 使えるようになった!
  2115. tmpCastName = BETWEENSTR(tmpstr,"は ","が 使えるようになった!")
  2116. castm[tmpCastName] = 0
  2117. i = i + 1
  2118. Continue //次のログへ
  2119. ENDIF
  2120.  
  2121. //自前用キャストタイム 使用チェック
  2122. for castNo=0 TO length(castm) - 1
  2123. tmpCastName = castm[castNo,HASH_KEY]
  2124.  
  2125. //通常
  2126. IFB 0 <> POS(tmpCastName + "!",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
  2127. //★の 真・やいばくだき!
  2128. //★の 真・オノむそう!
  2129. castm[tmpCastName] = GETTIME()
  2130. //バフで再検知するのでスキップはしない
  2131. //i = i + 1
  2132. //Continue 2//次のログへ
  2133. ENDIF
  2134.  
  2135. //特殊
  2136. IFB tmpCastName = "ジバルンバ" OR _
  2137. tmpCastName = "超暴走魔法陣" OR _
  2138. tmpCastName = "ドラゴンステップ" OR _
  2139. tmpCastName = "ビーナスステップ" OR _
  2140. tmpCastName = "ロイヤルステップ"
  2141. IFB 0 <> POS(tmpCastName + "を",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
  2142. //★は ドラゴンステップをおどった!
  2143. //★は ビーナスステップをおどった!
  2144. //★は 超暴走魔法陣を つくりだした!
  2145. //★は ジバルンバを となえた!
  2146. //★は ジバルンバを しかけた。
  2147. castm[tmpCastName] = GETTIME()
  2148. i = i + 1
  2149. Continue 2//次のログへ
  2150. ENDIF
  2151. ENDIF
  2152. IFB tmpCastName = "ためる参"
  2153. IFB 0 <> POS("全身に ちからを ためた!",tmpstr,1) AND 0 <> POS(sta_id[0,HASH_VAL],tmpstr,1)
  2154. //↓ためる123全て共通
  2155. //★は 全身に ちからを ためた!
  2156. castm[tmpCastName] = GETTIME()
  2157. i = i + 1
  2158. Continue 2//次のログへ
  2159. ENDIF
  2160. ENDIF
  2161.  
  2162. next
  2163.  
  2164. //2段階バフのチェック
  2165. for buffNo=0 TO length(buff2_name) - 1
  2166. //バフ名で検索
  2167.  
  2168. //呪文耐性のみの別パターン
  2169. IFB buff2_name[buffNo] = "呪文耐性"
  2170. IFB 0 <> POS("もどった!",tmpstr,-1)
  2171. IFB 0 <> POS("呪文の耐性",tmpstr,-1)
  2172. charNo = 0
  2173. for tmpCharNo=0 TO length(sta_name) - 1
  2174. //IDで検索 優先
  2175. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2176. charNo = tmpCharNo
  2177. Break
  2178. ENDIF
  2179. //名前で検索 サポ名が同じ場合はかぶる
  2180. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2181. charNo = tmpCharNo
  2182. Break
  2183. ENDIF
  2184. next
  2185. buff2_rank[buffNo][charNo] = 0
  2186. buff2_stat[buffNo][charNo] = GETTIME()
  2187. //buffNoスキップ & 次のログへ
  2188. break
  2189. ENDIF
  2190. ENDIF
  2191. ENDIF
  2192.  
  2193. IFB 0 <> POS(buff2_name[buffNo],tmpstr,1)
  2194. //以下のどれか
  2195. // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が 少し あがった!
  2196. // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が かなり あがった!
  2197. // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が 少し さがった!
  2198. // → \s[キャラ名]\m[キャラID]\eの [バフ名称]が かなり さがった!
  2199. // → \s[キャラ名]\m[キャラID]\eの [バフ名称]アップの 効果延長!
  2200. // → [サポ名]の [バフ名称]アップの 効果延長!
  2201. //\s[キャラ名]\m[キャラID]\eの [バフ名称]が もとにもどった!
  2202. // → \s[キャラ名]\m[キャラID]\eの コマンド間隔が かなり 短くなった!
  2203. charNo = -1
  2204. for tmpCharNo=0 TO length(sta_name) - 1
  2205. //IDで検索 優先
  2206. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2207. charNo = tmpCharNo
  2208. Break
  2209. ENDIF
  2210. //名前で検索 サポ名が同じ場合はかぶる
  2211. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2212. charNo = tmpCharNo
  2213. Break
  2214. ENDIF
  2215. next
  2216. IFB charNo = -1
  2217. //仲間キャラ以外(モンスターのログ)
  2218. break //buffNoスキップ & 次のログへ
  2219. ENDIF
  2220. //段階チェック
  2221.  
  2222. IFB buff2_name[buffNo] = "コマンド間隔" //特殊
  2223. rank_upstr = "短くなった!"
  2224. rank_dwstr = "長くなった!"
  2225. ELSE
  2226. rank_upstr = "あがった!"
  2227. rank_dwstr = "さがった!"
  2228. ENDIF
  2229.  
  2230. IFB 0 <> POS(" 少し " + rank_upstr,tmpstr,-1)
  2231. buff2_rank[buffNo][charNo] = buff2_rank[buffNo][charNo] + 1
  2232. buff2_stat[buffNo][charNo] = GETTIME()
  2233. break //buffNoスキップ & 次のログへ
  2234. ELSEIF 0 <> POS(" 少し " + rank_dwstr,tmpstr,-1)
  2235. buff2_rank[buffNo][charNo] = buff2_rank[buffNo][charNo] - 1
  2236. buff2_stat[buffNo][charNo] = GETTIME()
  2237. break //buffNoスキップ & 次のログへ
  2238. ELSEIF 0 <> POS(" かなり " + rank_upstr,tmpstr,-1)
  2239. buff2_rank[buffNo][charNo] = 2
  2240. buff2_stat[buffNo][charNo] = GETTIME()
  2241. break //buffNoスキップ & 次のログへ
  2242. ELSEIF 0 <> POS(" かなり " + rank_dwstr,tmpstr,-1)
  2243. buff2_rank[buffNo][charNo] = -2
  2244. buff2_stat[buffNo][charNo] = GETTIME()
  2245. break //buffNoスキップ & 次のログへ
  2246. ELSEIF 0 <> POS("もどった!",tmpstr,-1)
  2247. buff2_rank[buffNo][charNo] = 0
  2248. buff2_stat[buffNo][charNo] = GETTIME()
  2249. break //buffNoスキップ & 次のログへ
  2250. ELSEIF 0 <> POS("効果延長!",tmpstr,-1)
  2251. buff2_stat[buffNo][charNo] = GETTIME()
  2252. break //buffNoスキップ & 次のログへ
  2253. ENDIF
  2254. ENDIF
  2255. next
  2256.  
  2257. //1段階バフAタイプのチェック
  2258. for buffNo=0 TO length(buff1a_stas) - 1
  2259. //buff1a_stas[] 効果発生時文字列
  2260. //buff1a_ends[] 効果終了時文字列
  2261. //buff1a_exts[] 効果延長時文字列
  2262. buff1rank = ""
  2263. IFB 0 <> POS(buff1a_stas[buffNo],tmpstr,1)
  2264. buff1rank = 1
  2265. ELSEIF 0 <> POS(buff1a_ends[buffNo],tmpstr,1)
  2266. buff1rank = 0
  2267. ELSEIF 0 <> POS(buff1a_exts[buffNo],tmpstr,1)
  2268. buff1rank = 1
  2269. ENDIF
  2270.  
  2271. IFB buff1rank <> ""
  2272. //1段階バフの場合
  2273. charNo = -1
  2274. for tmpCharNo=0 TO length(sta_name)
  2275. //IDで検索 優先
  2276. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2277. charNo = tmpCharNo
  2278. Break
  2279. ENDIF
  2280. //名前で検索 サポ名が同じ場合はかぶる
  2281. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2282. charNo = tmpCharNo
  2283. Break
  2284. ENDIF
  2285. next
  2286. IFB charNo = -1
  2287. //仲間キャラ以外(モンスターのログ)
  2288. break //buffNoスキップ & 次のログへ
  2289. ENDIF
  2290. buff1a_rank[buffNo][charNo] = buff1rank
  2291. buff1a_stat[buffNo][charNo] = GETTIME()
  2292. //buffNoスキップ & 次のログへ
  2293. break
  2294. ENDIF
  2295. next
  2296.  
  2297. //1段階バフBタイプのチェック
  2298. for buffNo=0 TO length(buff1b_stas) - 1
  2299. //buff1b_stas[] 効果発生時文字列
  2300. //buff1b_ends[] 効果終了時文字列
  2301. buff1rank = ""
  2302. IFB 0 <> POS(buff1b_stas[buffNo],tmpstr,1)
  2303. buff1rank = 1
  2304. ELSEIF 0 <> POS(buff1b_ends[buffNo],tmpstr,1)
  2305. buff1rank = 0
  2306. ENDIF
  2307.  
  2308. IFB buff1rank <> ""
  2309. //1段階バフの場合
  2310. charNo = -1
  2311. for tmpCharNo=0 TO length(sta_name)
  2312. //IDで検索 優先
  2313. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2314. charNo = tmpCharNo
  2315. Break
  2316. ENDIF
  2317. //名前で検索 サポ名が同じ場合はかぶる
  2318. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2319. charNo = tmpCharNo
  2320. Break
  2321. ENDIF
  2322. next
  2323. IFB charNo = -1
  2324. //仲間キャラ以外(モンスターのログ)
  2325. break //buffNoスキップ & 次のログへ
  2326. ENDIF
  2327. buff1b_rank[buffNo][charNo] = buff1rank
  2328. buff1b_stat[buffNo][charNo] = GETTIME()
  2329. //buffNoスキップ & 次のログへ
  2330. break
  2331. ENDIF
  2332. next
  2333.  
  2334. //1段階バフCタイプのチェック
  2335. //★の 早詠みの杖!
  2336. //★の 早詠みの杖の効果が きえた!
  2337. IFB 0 <> POS("の 早詠みの杖",tmpstr,-1)
  2338. charNo = -1
  2339. for tmpCharNo=0 TO length(sta_name)
  2340. //IDで検索 優先
  2341. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2342. charNo = tmpCharNo
  2343. Break
  2344. ENDIF
  2345. //名前で検索 サポ名が同じ場合はかぶる
  2346. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2347. charNo = tmpCharNo
  2348. Break
  2349. ENDIF
  2350. next
  2351. IFB charNo = -1
  2352. //仲間キャラ以外(モンスターのログ)
  2353. i = i + 1
  2354. Continue //次のログへ
  2355. ENDIF
  2356. IFB 0 <> POS("きえた!",tmpstr,-1)
  2357. buff1c_rank[0][charNo] = 0
  2358. ELSE
  2359. buff1c_rank[0][charNo] = 1
  2360. buff1c_stat[0][charNo] = GETTIME()
  2361. ENDIF
  2362. ENDIF
  2363. //★の ラピッドステッキ!
  2364. // → ★は すばやく 呪文を となえられる!
  2365. //★の ラピッドステッキの効果が きえた!
  2366. IFB 0 <> POS("ラピッドステッキ",tmpstr,-1)
  2367. charNo = -1
  2368. for tmpCharNo=0 TO length(sta_name)
  2369. //IDで検索 優先
  2370. IFB 0 <> POS(sta_id[tmpCharNo,HASH_VAL],tmpstr,1)
  2371. charNo = tmpCharNo
  2372. Break
  2373. ENDIF
  2374. //名前で検索 サポ名が同じ場合はかぶる
  2375. IFB 0 <> POS(sta_name[tmpCharNo,HASH_VAL],tmpstr,1)
  2376. charNo = tmpCharNo
  2377. Break
  2378. ENDIF
  2379. next
  2380. IFB charNo = -1
  2381. //仲間キャラ以外(モンスターのログ)
  2382. i = i + 1
  2383. Continue //次のログへ
  2384. ENDIF
  2385. IFB 0 <> POS("ラピッドステッキ!",tmpstr,-1)
  2386. buff1c_rank[1][charNo] = 1
  2387. buff1c_stat[1][charNo] = GETTIME()
  2388. ELSEIF 0 <> POS("ラピッドステッキの効果",tmpstr,-1)
  2389. buff1c_rank[1][charNo] = 0
  2390. ENDIF
  2391. ENDIF
  2392.  
  2393. ENDIF
  2394. i = i + 1
  2395. Wend
  2396.  
  2397. info_batt_str = info_batt_str + "開始:" + format(batt_sta_id,8,-1)
  2398. info_batt_str = info_batt_str + " 終了:" + format(batt_end_id,8,-1) + "<#CR>"
  2399.  
  2400. //ステータスの表示
  2401. // for i = 0 TO Length(sta_name) - 1 //取得順
  2402. // for i = Length(sta_name) - 1 TO 0 STEP -1 //逆順(表示と同じ)
  2403. // info_batt_str = info_batt_str + format(" ",12 - lengthB(sta_name[i,HASH_VAL])) + sta_name[i,HASH_VAL] + ":"
  2404. // info_batt_str = info_batt_str + format(" ", 9 - lengthB(sta_id[i,HASH_VAL])) + sta_id[i,HASH_VAL] + ":"
  2405. // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_job[i,HASH_VAL])) + sta_job[i,HASH_VAL] + ":"
  2406. // info_batt_str = info_batt_str + format(" ", 2 - lengthB(sta_lv[i,HASH_VAL])) + sta_lv[i,HASH_VAL] + ":"
  2407. // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_hpnow[i,HASH_VAL])) + sta_hpnow[i,HASH_VAL] + "/"
  2408. // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_hpmax[i,HASH_VAL])) + sta_hpmax[i,HASH_VAL] + ":"
  2409. // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_mpnow[i,HASH_VAL])) + sta_mpnow[i,HASH_VAL] + "/"
  2410. // info_batt_str = info_batt_str + format(" ", 4 - lengthB(sta_mpmax[i,HASH_VAL])) + sta_mpmax[i,HASH_VAL] + ":"
  2411. // info_batt_str = info_batt_str + "<#CR>"
  2412. // next
  2413.  
  2414. //キャスト技の表示
  2415. for castNo=0 TO length(castm) - 1
  2416. tmpCastName = castm[castNo,HASH_KEY]
  2417. maxCastTime = castTimeMax[tmpCastName]
  2418. remain = maxCastTime - ( GETTIME() - castm[castNo,HASH_VAL] )
  2419. IFB remain > 0
  2420. remain = format(remain / (maxCastTime / progres_num) ,5,0)
  2421. progres = format(progres_ful, remain) + format(progres_emp, progres_num - remain)
  2422. info_batt_str = info_batt_str + tmpCastName + ":" + progres + "<#CR>"
  2423. ELSE
  2424. info_batt_str = info_batt_str + tmpCastName + ":" + "OK" + "<#CR>"
  2425. ENDIF
  2426. next
  2427.  
  2428. //バフ表示
  2429. // :攻:守:早:
  2430. // キャラ名: 1: 2: 0:
  2431. info_batt_str = info_batt_str + format(" ",12) + ":"
  2432. //2段階バフ表示名
  2433. for buffNo=0 TO length(buff2_sname) - 1
  2434. info_batt_str = info_batt_str + buff2_sname[buffNo] + ":"
  2435. next
  2436. //1段階バフ表示名Aタイプ
  2437. for buffNo=0 TO length(buff1a_sname) - 1
  2438. info_batt_str = info_batt_str + buff1a_sname[buffNo] + ":"
  2439. next
  2440. //1段階バフ表示名Bタイプ
  2441. for buffNo=0 TO length(buff1b_sname) - 1
  2442. info_batt_str = info_batt_str + buff1b_sname[buffNo] + ":"
  2443. next
  2444. //1段階バフ表示名Cタイプ
  2445. for buffNo=0 TO length(buff1c_sname) - 1
  2446. info_batt_str = info_batt_str + buff1c_sname[buffNo] + ":"
  2447. next
  2448. info_batt_str = info_batt_str + "<#CR>"
  2449.  
  2450. for tmpCharNo = Length(sta_name) - 1 TO 0 STEP -1
  2451. info_batt_str = info_batt_str + format(" ",12 - lengthB(sta_name[tmpCharNo,HASH_VAL])) + sta_name[tmpCharNo,HASH_VAL] + ":"
  2452. //2段階バフ表示
  2453. for buffNo=0 TO length(buff2_name) - 1
  2454. tmpRank = buff2_rank[buffNo][tmpCharNo]
  2455. IF tmpRank = "" Then tmpRank = 0
  2456. IFB tmpRank < 0
  2457. //マイナス時は警告無し
  2458. time_warn = ""
  2459. ELSE
  2460. //残り時間警告
  2461. IFB tmpRank <> 0 AND ( buff2_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff2_stat[buffNo][tmpCharNo] )
  2462. time_warn = time_warn_char
  2463. ELSE
  2464. time_warn = " "
  2465. ENDIF
  2466. IF tmpRank = 0 Then tmpRank = " "
  2467. ENDIF
  2468. info_batt_str = info_batt_str + time_warn + tmpRank + ":"
  2469. next
  2470. //1段階バフ表示Aタイプ
  2471. for buffNo=0 TO length(buff1a_stas) - 1
  2472. tmpRank = buff1a_rank[buffNo][tmpCharNo]
  2473. IF tmpRank = "" Then tmpRank = 0
  2474. IFB tmpRank < 0
  2475. //マイナス時は警告無し
  2476. time_warn = ""
  2477. ELSE
  2478. //残り時間警告
  2479. IFB tmpRank <> 0 AND ( buff1a_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1a_stat[buffNo][tmpCharNo] )
  2480. time_warn = time_warn_char
  2481. ELSE
  2482. time_warn = " "
  2483. ENDIF
  2484. IF tmpRank = 0 Then tmpRank = " "
  2485. ENDIF
  2486. info_batt_str = info_batt_str + time_warn + tmpRank + ":"
  2487. next
  2488. //1段階バフ表示Bタイプ
  2489. for buffNo=0 TO length(buff1b_stas) - 1
  2490. tmpRank = buff1b_rank[buffNo][tmpCharNo]
  2491. IF tmpRank = "" Then tmpRank = 0
  2492. IFB tmpRank < 0
  2493. //マイナス時は警告無し
  2494. time_warn = ""
  2495. ELSE
  2496. //残り時間警告
  2497. IFB tmpRank <> 0 AND ( buff1b_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1b_stat[buffNo][tmpCharNo] )
  2498. time_warn = time_warn_char
  2499. ELSE
  2500. time_warn = " "
  2501. ENDIF
  2502. IF tmpRank = 0 Then tmpRank = " "
  2503. ENDIF
  2504. info_batt_str = info_batt_str + time_warn + tmpRank + ":"
  2505. next
  2506. //1段階バフ表示Cタイプ
  2507. for buffNo=0 TO length(buff1c_sname) - 1
  2508. tmpRank = buff1c_rank[buffNo][tmpCharNo]
  2509. IF tmpRank = "" Then tmpRank = 0
  2510. IFB tmpRank < 0
  2511. //マイナス時は警告無し
  2512. time_warn = ""
  2513. ELSE
  2514. //残り時間警告
  2515. IFB tmpRank <> 0 AND ( buff1c_maxt[buffNo] - time_warn_rest ) < ( GETTIME() - buff1c_stat[buffNo][tmpCharNo] )
  2516. time_warn = time_warn_char
  2517. ELSE
  2518. time_warn = " "
  2519. ENDIF
  2520. IF tmpRank = 0 Then tmpRank = " "
  2521. ENDIF
  2522. info_batt_str = info_batt_str + time_warn + tmpRank + ":"
  2523. next
  2524.  
  2525. info_batt_str = info_batt_str + "<#CR>"
  2526. next
  2527.  
  2528. Mutex.Unlock("info_batt_trd",info_batt_trd)
  2529. Mutex.Unlock("info_slog_trd",info_slog_trd)
  2530.  
  2531. timer_battf = (GETTIME() * 1000 + G_TIME_ZZ) - timer_battf
  2532. FEND
  2533.  
  2534.  
  2535. //ログファイル出力(スレッド処理)
  2536. PROCEDURE TRD_log_output()
  2537.  
  2538. WHILE true
  2539. timer_fwrite = GETTIME() * 1000 + G_TIME_ZZ
  2540.  
  2541. //システムログ
  2542. //最終行のメッセージIDを取得
  2543. fid_slog = FOPEN(slogpath, F_READ)
  2544. eol = FGET(fid_slog, F_LINECOUNT )
  2545. oldSLogId = VAL( "$" + COPY(FGET(fid_slog, eol),1,8) )
  2546. FCLOSE(fid_slog)
  2547.  
  2548. Mutex.Lock(info_slog_trd)
  2549.  
  2550. lastnum = length(syslog_wflg) - 1 //syslog_wflgが最後に処理されるので
  2551. outstr = ""
  2552. for i = 0 TO lastnum
  2553. IFB syslog_wflg[i,HASH_VAL] = 0 //未書込
  2554. tmpkey = syslog_wflg[i,HASH_KEY]
  2555. outstr = outstr + syslog_wflg[i,HASH_KEY] + "," + _
  2556. syslog_time[i,HASH_VAL] + "," + _
  2557. syslog_type[i,HASH_VAL] + "," + _
  2558. syslog_str[i,HASH_VAL] + "<#CR>"
  2559. syslog_wflg[tmpkey] = 1//書込完了
  2560. Sleep(0.1)
  2561. ENDIF
  2562. next
  2563. //まとめて書込
  2564. IFB outstr <> ""
  2565. outstr = TRIM(outstr)
  2566. outstr = TRIM(outstr)
  2567. fid_slog = FOPEN(slogpath, F_READ or F_WRITE)
  2568. FPUT(fid_slog, outstr)
  2569. FCLOSE(fid_slog)
  2570. ENDIF
  2571.  
  2572. Mutex.Unlock("info_slog_trd",info_slog_trd)
  2573.  
  2574.  
  2575. //チャットログ
  2576. //最終行のメッセージIDを取得
  2577. fid_chat = FOPEN(clogpath, F_READ)
  2578. eol = FGET(fid_chat, F_LINECOUNT )
  2579. oldSLogId = VAL( "$" + COPY(FGET(fid_chat, eol),1,8) )
  2580. FCLOSE(fid_chat)
  2581.  
  2582. Mutex.Lock(info_chat_trd)
  2583.  
  2584. lastnum = length(chtlog_wflg) - 1 //chtlog_wflgが最後に処理されるので
  2585. outstr = ""
  2586. for i = 0 TO lastnum
  2587. IFB chtlog_wflg[i,HASH_VAL] = 0 //未書込
  2588. tmpkey = chtlog_wflg[i,HASH_KEY]
  2589. outstr = outstr + chtlog_wflg[i,HASH_KEY] + "," + _
  2590. chtlog_srcid[i,HASH_VAL] + "," + _
  2591. chtlog_desid[i,HASH_VAL] + "," + _
  2592. chtlog_tmp[i,HASH_VAL] + "," + _
  2593. chtlog_room[i,HASH_VAL] + "," + _
  2594. chtlog_src[i,HASH_VAL] + "," + _
  2595. chtlog_des[i,HASH_VAL] + "," + _
  2596. chtlog_str[i,HASH_VAL] + "<#CR>"
  2597. chtlog_wflg[tmpkey] = 1//書込完了
  2598. Sleep(0.1)
  2599. ENDIF
  2600. next
  2601. //まとめて書込
  2602. IFB outstr <> ""
  2603. outstr = TRIM(outstr)
  2604. fid_chat = FOPEN(clogpath, F_READ or F_WRITE)
  2605. FPUT(fid_chat, outstr)
  2606. FCLOSE(fid_chat)
  2607. ENDIF
  2608.  
  2609. Mutex.Unlock("info_chat_trd",info_chat_trd)
  2610.  
  2611. timer_fwrite = (GETTIME() * 1000 + G_TIME_ZZ) - timer_fwrite
  2612.  
  2613. //ファイル書き込みインターバル
  2614. timer_fwrite_old = VAL(format( (fwiv - timer_fwrite) / 1000 ,5,3))
  2615. IFB timer_fwrite_old > 0
  2616. Sleep(timer_fwrite_old)
  2617. Else
  2618. //時間超過
  2619. Sleep(0.001)
  2620. ENDIF
  2621. Wend
  2622.  
  2623. FEND
  2624.  
  2625.  
  2626.  
  2627.  
  2628. //BYTE値をDQX内キャラクターIDへ変換
  2629. FUNCTION byte2charid(byte_array[])
  2630.  
  2631. IFB 4 = LENGTH(byte_array)
  2632. tmpnum = (byte_array[0] * 1) + (byte_array[1] * $100 ) + (byte_array[2] * $10000 ) + (byte_array[3] * $1000000)
  2633. tmpnum = FORMAT(tmpnum,9)
  2634. tmpnum = REPLACE(tmpnum," ","0")
  2635. tmphead = COPY(tmpnum,1,3)
  2636. tmpC = COPY(tmpnum,4)
  2637. tmpA = tmphead / 26
  2638. tmpA = CHRB(tmpA+65)
  2639. tmpB = tmphead MOD 26
  2640. tmpB = CHRB(tmpB+65)
  2641. RESULT = tmpA + tmpB + tmpC
  2642. Exit
  2643. ELSE
  2644. MSGBOX("byte2dword :配列数エラー:" + LENGTH(byte_array))
  2645. ExitExit
  2646. ENDIF
  2647. Exit
  2648. FEND
  2649.  
  2650. //戦闘関連の表示
  2651. PROCEDURE fight_info()
  2652. infohead = infohead + "戦闘状態:" + fight_flg + "<#CR>"
  2653. infohead = infohead + "戦闘開始:" + fight_sta + "<#CR>"
  2654. IFB fight_flg = 0
  2655. infohead = infohead + "前回時間:" + fight_time + "<#CR>"
  2656. ELSE
  2657. fight_time = (GETTIME() - fight_sta)
  2658. infohead = infohead + "戦闘時間:" + fight_time + "<#CR>"
  2659. ENDIF
  2660. infohead = infohead + "食らいダメージ<#CR>"
  2661.  
  2662. for i = 0 TO LENGTH(fight_char) - 1
  2663. tmpcha = fight_char[i,HASH_KEY]
  2664. tmpnum = fight_char[i,HASH_VAL]
  2665. infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
  2666. next
  2667. for i = 0 TO LENGTH(fight_mons) - 1
  2668. tmpcha = fight_mons[i,HASH_KEY]
  2669. tmpnum = fight_mons[i,HASH_VAL]
  2670. infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
  2671. next
  2672.  
  2673. infohead = infohead + "与えたダメージ<#CR>"
  2674.  
  2675. for i = 0 TO LENGTH(fight_charAtk) - 1
  2676. tmpcha = fight_charAtk[i,HASH_KEY]
  2677. tmpnum = fight_charAtk[i,HASH_VAL]
  2678. IF fight_time = 0 THEN fight_time = 1//0除算防止
  2679. infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + _
  2680. " DPS:" + FORMAT((tmpnum / fight_time),1,1) + "<#CR>"
  2681. next
  2682. for i = 0 TO LENGTH(fight_monsAtk) - 1
  2683. tmpcha = fight_monsAtk[i,HASH_KEY]
  2684. tmpnum = fight_monsAtk[i,HASH_VAL]
  2685. infohead = infohead + FORMAT(" ",22 - LENGTHB(tmpcha)) + tmpcha + ":" + FORMAT(" ",5 - LENGTHB(tmpnum)) + tmpnum + "<#CR>"
  2686. next
  2687. FEND
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693. PROCEDURE slogCHK(slogStr)
  2694. FEND
  2695.  
  2696. //正規表現置換
  2697. Function regReplace(str, ptn, rep)
  2698. Dim reg = CreateOLEObj("VBScript.Regexp")
  2699. reg.Global = true
  2700. reg.Multiline = true
  2701. reg.IgnoreCase = true
  2702. reg.pattern = ptn
  2703. Result = reg.Replace(str,rep)
  2704. FEND
  2705.  
  2706. Function regTest(str, ptn)
  2707. Dim reg = CreateOLEObj("VBScript.Regexp")
  2708. reg.Global = true
  2709. reg.Multiline = true
  2710. reg.IgnoreCase = true
  2711. reg.pattern = ptn
  2712.  
  2713. IFB reg.Test(str) = 0
  2714. Result = false
  2715. ELSE
  2716. Result = true
  2717. ENDIF
  2718. FEnd
  2719.  
  2720. //Mutexで排他制御
  2721. //
  2722. //handleA = Mutex.Init(name)
  2723. //Mutex.Lock(handleA)
  2724. //Mutex.Unlock(name,handleA)
  2725. //Mutex.Release(name,handleA)
  2726. MODULE Mutex
  2727. CONST _wait = 0.001
  2728.  
  2729. DEF_DLL CloseHandle(dword): bool: kernel32.dll
  2730. DEF_DLL GetLastError(): dword: kernel32.dll
  2731. DEF_DLL WaitForSingleObject(dword, dword): dword: kernel32.dll
  2732.  
  2733. // Mutex用
  2734. DEF_DLL CreateMutexA(dword, bool, string): dword: kernel32.dll
  2735. DEF_DLL ReleaseMutex(dword): bool: kernel32.dll
  2736.  
  2737. FUNCTION Init(name)
  2738. ret = CreateMutexA(NULL, FALSE, NULL)
  2739. IFB ret = NULL
  2740. print "InitMutex CreateMutexA Error:" + name + ":" + GetLastError()
  2741. MSGBOX("InitMutex CreateMutexA Error:" + name + ":" + GetLastError())
  2742. ExitExit
  2743. ENDIF
  2744. RESULT = ret
  2745. FEND
  2746.  
  2747. FUNCTION Lock(handle)
  2748. RESULT = TRUE
  2749. WHILE !TryLock(handle)
  2750. SLEEP(_wait)
  2751. WEND
  2752. FEND
  2753.  
  2754. FUNCTION TryLock(handle)
  2755. RESULT = FALSE
  2756. DIM ret = WaitForSingleObject(handle, 0)
  2757. IF ret = 0 Then RESULT = TRUE
  2758. FEND
  2759.  
  2760. PROCEDURE Unlock(name,handle)
  2761. IFB !ReleaseMutex(handle)
  2762. print "UnlockMutex ReleaseMutex Error:" + name + ":" + GetLastError()
  2763. MSGBOX("UnlockMutex ReleaseMutex Error:" + name + ":" + GetLastError())
  2764. ExitExit
  2765. ENDIF
  2766. FEND
  2767.  
  2768. PROCEDURE Release(name,handle)
  2769. IFB !CloseHandle(handle)
  2770. print "CloseMutex CloseHandle Error:" + name + ":" + GetLastError()
  2771. MSGBOX("CloseMutex CloseHandle Error:" + name + ":" + GetLastError())
  2772. ExitExit
  2773. ENDIF
  2774. FEND
  2775.  
  2776. ENDMODULE
  2777. ///////////////////////////////////////////////////////////////////////////////////////////////
  2778. //覚書
  2779. //
  2780. //BaseAddr検索
  2781. //AVbad_exception@std@@
  2782. //で検索して0x500ほど+
  2783. //00が消えたところがBase?
  2784. //
  2785. //011ADA26-011ADA3A: 15h(21)Byte [UTF-8]
  2786. //Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
  2787. //011ADA26 : 41 56 62 61 64 5F 65 78 63 65 70 74 69 6F 6E 40 AVbad_exception@
  2788. //011ADA36 : 73 74 64 40 40 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? std@@
  2789. //
  2790. //
  2791. //**log の格納(予想)**
  2792. //*チャットログ*
  2793. //DQXBaseAddr + logPO → logBA
  2794. //logBA + logDOchat → チャットログ基点アドレス
  2795. //
  2796. //発言元キャラと発言先キャラが 指定無しの白チャは発言先なし
  2797. //元キャラID 先キャラID Chat通番 何か? ルーム番号? 元キャラ名 先キャラ名 Chat上段 下段
  2798. //4byte 4 4 4 4 19 19 61 61
  2799. //
  2800. //Chat上下段はUTF-8なので一文字MAX6byte
  2801. //上下段が全角10文字 = 60 + 終端
  2802. //
  2803. //キャラ名はUTF-8だが制限で一文字MAX3byte?
  2804. //キャラ名が全角6文字 = 18 + 終端
  2805. //発言先キャラ名が全角6文字 = 18 + 終端
  2806. //
  2807. //180byteでChat発言1個
  2808. //Chatが180個分連続した後の4byte180がおそらく表示順に格納アドレス
  2809. //
  2810. //チャット用最大バッファサイズ
  2811. //(180 * 180) + (4 * 180)
  2812. //
  2813. //*システムログ*
  2814. //DQXBaseAddr + logPO → logBA
  2815. //logBA + logDOsytm → システムログ基点アドレス
  2816. //
  2817. //システムログ基点アドレス 2個前の 4byte システムログの開始アドレスオフセット logSystmSta
  2818. //システムログ基点アドレス 1個前の 4byte システムログの終了アドレスオフセット logSystmEnd
  2819. //ログは一定量でループするので 基点アドレス から 基点アドレス+$609B が書き換わる
  2820. //
  2821. //(logSystmStaが0ではない場合)
  2822. //基点アドレス+logSystmSta ~ 基点アドレス+$609B(終端)
  2823. //と
  2824. //基点アドレス ~ 基点アドレス+logSystmEnd
  2825. //を結合
  2826. //
  2827. //メッセージ通番 種類 長さ メッセージ
  2828. //4byte 1 1 不定
  2829. //
  2830. //種類
  2831. // 1:ダメージ 4:回復 5:通常 6:戦闘後
  2832. //18:時刻 19:郵便Item 20:郵便G 24:ドラキー
  2833. //
  2834. //(例)
  2835. //logBA+logDOsytm→$160B0270(基点)
  2836. //$160B0270+$609B→$160B630B(終点)
  2837. //Address : +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
  2838. //160B6290 : E3 83 A1 E3 83 BC E3 82 B8 EF BC 81 00 A2 E3 83 メ ー ジ !
  2839. //160B62A0 : 15 03 00 00 00 3C 20 E2 86 92 20 E3 82 AD E3 83 < → キ ラ
  2840. //160B62B0 : A9 E3 83 BC E3 82 B8 E3 83 A3 E3 83 83 E3 82 AF ー ジ ャ ッ ク
  2841. //160B62C0 : E3 81 AB 20 34 39 E3 81 AE E3 83 80 E3 83 A1 E3 に 49の ダ メ ー
  2842. //160B62D0 : 83 BC E3 82 B8 EF BC 81 00 81 00 00 16 03 00 00 ジ !
  2843. //160B62E0 : 05 2C E3 82 A2 E3 83 B3 E3 83 AB E3 82 B7 E3 82 ,ア ン ル シ ア
  2844. //160B62F0 : A2 E3 81 AE 20 E3 81 93 E3 81 86 E3 81 92 E3 81 の こ う げ き
  2845. //160B6300 : 8D EF BC 81 00 00 00 00 00 00 00 00 15 00 00 00 !
  2846. //160B6310 : 00 00 00 00 3E 01 00 00 00 00 12 50 00 00 00 00 > P
  2847. //最終メッセージ
  2848. //160B62DCから開始
  2849. //160B62DC→$00000316(通番)
  2850. //160B62E0→$05(type)
  2851. //160B62E1→$2C(文字長)
  2852. //160B62DC+$2C→160B6308(終端)
  2853. //
  2854. //
  2855. //**Statusの格納(予想)**
  2856. //**
  2857. //DQXBaseAddr + staPO → staBA
  2858. //
  2859. //old
  2860. //staBA + $2988 → 人数(n)
  2861. //staBA + $2970 + (n-1)*4byte → キャラステータス格納アドレス
  2862. //charBA(n) + $E8 → キャラクター名
  2863. //charBA(n) + $10C → キャラクタID(サポは$00000000)
  2864. //charBA(n) + $121 → 職種類
  2865. //charBA(n) + $122 → LV
  2866. //charBA(n) + $124 → HPmax
  2867. //charBA(n) + $126 → MPmax
  2868. //charBA(n) + $13C → HPnow
  2869. //charBA(n) + $13E → MPnow
  2870. //
  2871. //new(3.1.5b~)
  2872. //staBA + $20F8 → 人数(n)
  2873. //staBA + $20E0 + (n-1)*4byte → キャラステータス格納アドレス
  2874. //charBA(n) + $60 → キャラクター名
  2875. //charBA(n) + $84 → キャラクタID(サポは$00000000)
  2876. //charBA(n) + $95 → 職種類
  2877. //charBA(n) + $96 → LV
  2878. //charBA(n) + $AC → HPmax
  2879. //charBA(n) + $AE → MPmax
  2880. //charBA(n) + $B0 → HPnow
  2881. //charBA(n) + $B2 → MPnow
  2882. //
  2883. //職業
  2884. //02:戦士 06:盗賊 0A:魔法戦士 0E:まもの使い
  2885. //03:僧侶 07:旅芸人 0B:レンジャー 0F:どうぐ使い
  2886. //04:魔法使い 08:バトルマスター 0C:賢者 10:踊り子
  2887. //05:武闘家 09:パラディン 0D:スーパースター
  2888. //2文字版 02:戦士 03:僧侶 04:魔法 05:武闘 06:盗賊 07:旅芸 08:バト 09:パラ 0A:魔戦 0B:レン 0C:賢者 0D:スパ 0E:まも 0F:どう 10:踊り
  2889. //1文字版 02:戦 03:僧 04:魔 05:武 06:盗 07:旅 08:バ 09:パ 0A:電 0B:レ 0C:賢 0D:ス 0E:ま 0F:ど 10:踊
  2890. //
  2891. //
  2892. //
  2893. //
  2894. //
  2895. ///////////////////////////////////////////////////////////////////////////////////////////////
  2896.  
  2897.  
  2898. // バフ一覧
  2899. //【スカラ】【スクルト】
  2900. //【バイシオン】【バイキルト】【すてみ】
  2901. //【妖精たちのポルカ】(味方全体にスカラ+バイシオン+リホ+MP回復効果)
  2902. //【ピオラ】?【ピオリム】
  2903. //【ズッシード】
  2904. //【リホイミ】【リベホイミ】【リベホイム】【いやしの雨】?【明鏡止水】
  2905. //【バーハ】【フバーハ】【心頭滅却】
  2906. //【マホターン】
  2907. //【マホキテ】
  2908. //【マホステ】
  2909. //【マホカンタ】
  2910. //【魔結界】
  2911. //【魔力の息吹】
  2912. //【魔力かくせい】
  2913. //【ためる】【ためる弐】【テンションブースト】【一喝】(【ボケ】)(【とうこん撃ち】?)
  2914. //【早詠みの杖】
  2915. //【ビッグシールド】?
  2916. //【まもりのたて】
  2917. //【会心完全ガード】
  2918. //【マホトラのころも】
  2919. //【聖女の守り】
  2920. //【天使の守り】
  2921. //【聖なる祈り】
  2922. //【しんぴのさとり】
  2923. //【マジステッキ】
  2924. //【キラキラポーン】
  2925. //【タップダンス】
  2926. //【ファイアフォース】【アイスフォース】【ダークフォース】【ライトフォース】
  2927. //【メイクアップ】
  2928. //【パラディンガード】
  2929. //【アクロバットスター】
  2930. //【モンスターゾーン】
  2931.  
  2932. //2文字でまとめ
  2933. //攻↑ スク フバ 魔結 速度 魔↑ 回↑
  2934. //聖女 女神 天使 盾↑ 守盾 会心
  2935. //魔捨 魔衣 ポン 魔反 魔転
  2936. //reHP reMP
  2937. //炎↑ 氷↑ 風↑ 闇↑ 光↑
  2938. //重↑ 魅↑ 避↑
  2939. //早詠 ラピ
  2940. //テン
  2941.  
  2942. //1文字
  2943. //攻 ス フ 結 速 魔 回 聖 女 天 盾 守 会 捨 衣 ポ 反 転 rH rM 炎 氷 風 闇 光 重 魅 避 詠 ラ テ
  2944.  
  2945. //戦闘時ログ
  2946. //↓ここからコメント扱い
  2947. TextBlock CommentDAYOOO
  2948.  
  2949. 実キャラ ★:\s[キャラ名]\m[キャラID]\e
  2950. サポート ★:[キャラ名]
  2951.  
  2952. まじんで変化した場合は[キャラ名]のみ変わる
  2953. \sムッチーノ\m[キャラID]\eの たたかいのうた!
  2954.  
  2955. 時間で消えた場合は → は無し
  2956. [いてつくはどう]やデバフ魔法などは → がつく
  2957.  
  2958. ***まとめ***
  2959. → ★の こうげき力が 少し あがった!
  2960. → ★の こうげき力が かなり あがった!
  2961. → ★の こうげき力が もとにもどった!
  2962. → ★の こうげき力アップの 効果延長!
  2963. ★の こうげき力が もとにもどった!
  2964.  
  2965. → ★の しゅび力が 少し あがった!
  2966. → ★の しゅび力が かなり あがった!
  2967. → ★の しゅび力が もとにもどった!
  2968. → ★の しゅび力アップの 効果延長!
  2969. → ★の しゅび力が もとにもどった!
  2970. ★の しゅび力が もとにもどった!
  2971.  
  2972. → ★の ブレス耐性が もとにもどった!
  2973. → ★の ブレス耐性が かなり あがった!
  2974. → ★の ブレス耐性が 少し あがった!
  2975. → ★の ブレス耐性アップの 効果延長!
  2976. ★の ブレス耐性が もとにもどった!
  2977.  
  2978. → ★の 呪文の耐性が もとにもどった!
  2979. → ★の 呪文耐性が かなり あがった!
  2980. → ★の 呪文耐性が かなり さがった!
  2981. → ★の 呪文耐性が 少し あがった!
  2982. → ★の 呪文耐性が 少し さがった!
  2983. → ★の 呪文耐性アップの 効果延長!
  2984. → ★の 呪文耐性ダウンの 効果延長!
  2985. ★の 呪文の耐性が もとにもどった!
  2986.  
  2987. → ★の コマンド間隔が かなり 短くなった!
  2988. → ★の コマンド間隔が かなり 長くなった!
  2989. → ★の コマンド間隔が もとにもどった!
  2990. → ★の コマンド間隔が 少し 短くなった!
  2991. → ★の コマンド間隔が 少し 長くなった!
  2992. → ★の コマンド間隔延長の 効果延長!
  2993. → ★の コマンド間隔短縮の 効果延長!
  2994. → ★の コマンド間隔が もとにもどった!
  2995. ★の コマンド間隔が もとにもどった!
  2996. ★の コマンド間隔が 少し 短くなった!
  2997.  
  2998. → ★の 呪文の威力が かなり あがった!
  2999. → ★の 呪文の威力が もとにもどった!
  3000. → ★の 呪文の威力が 少し さがった!
  3001. → ★の 呪文の威力が もとにもどった!
  3002. ★の 呪文の威力が もとにもどった!
  3003.  
  3004. → ★の 呪文の回復力が かなり あがった!
  3005. → ★の 呪文の回復力が もとにもどった!
  3006. → ★の 呪文の回復量増加の 効果延長!
  3007. → ★の 重さが ふえた!
  3008. ★の 呪文の回復力が もとにもどった!
  3009.  
  3010. → ★の 重さが ふえた!
  3011. → ★の 重さが もとにもどった!
  3012. → ★の 重さアップの 効果延長!
  3013. ★の 重さが ふえた!
  3014. ★の 重さが もとにもどった!
  3015.  
  3016. → ★は 聖女の守りを 受けた!
  3017. → ★の 聖女の守りが きえた。
  3018. ★の 聖女の守りが きえた。
  3019.  
  3020. → ★の 天使の守りが きえた。
  3021.  
  3022. → ★の 女神の祝福が きえた。
  3023.  
  3024. ★の 会心ガード!
  3025. ★の 会心ガードが きえた。
  3026.  
  3027. → ★は 盾で ガードしやすくなった!
  3028. ★の 盾ガード率が もとにもどった!
  3029.  
  3030. → ★に 呪文をかきけす マホステ効果!
  3031. ★の マホステが きえた。
  3032.  
  3033. → ★は 悪い効果に かかりにくくなった!
  3034. ★の キラキラポーンが きえた。
  3035.  
  3036. → ★の みりょくが あがった!
  3037. ★の みりょくが もとにもどった!
  3038.  
  3039. → ★は マホトラのころもを 身にまとった!
  3040. → ★の マホトラのころもが きえた!
  3041. ★の マホトラのころもが きえた!
  3042.  
  3043. → ★の ストームフォースが とけた!
  3044.  
  3045. ★は むげんのさとりが 使えるようになった!
  3046. ★は イオグランデが 使えるようになった!
  3047. ★は スタンショットが 使えるようになった!
  3048. ★は スペルガードが 使えるようになった!
  3049. ★は ティンクルバトンが 使えるようになった!
  3050. ★は テンションバーンが 使えるようになった!
  3051. ★は ドルマドンが 使えるようになった!
  3052. ★は ファランクスが 使えるようになった!
  3053. ★は プレートインパクトが 使えるようになった!
  3054. ★は ホーリーライトが 使えるようになった!
  3055. ★は ミラクルブーストが 使えるようになった!
  3056. ★は ラピッドステッキが 使えるようになった!
  3057. ★は 女神の祝福が 使えるようになった!
  3058. ★は 復活の杖が 使えるようになった!
  3059. ★は 超暴走魔法陣が 使えるようになった!
  3060.  
  3061.  
  3062. ***元ログ***
  3063. → ★に 104のダメージ!
  3064. → ★に 呪文をかきけす マホステ効果!
  3065. → ★には きかなかった!
  3066. → ★には 何も おこらなかった!
  3067. → ★には 効果がなかった!
  3068. → ★の かいしんの いちげき!
  3069. → ★の からだから どくが きえた!
  3070. → ★の こうげき力が かなり あがった!
  3071. → ★の こうげき力が もとにもどった!
  3072. → ★の こうげき力が 少し あがった!
  3073. → ★の こうげき力が 少し さがった!
  3074. → ★の こうげき力アップの 効果延長!
  3075. → ★の しゅび力が かなり あがった!
  3076. → ★の しゅび力が かなり さがった!
  3077. → ★の しゅび力が もとにもどった!
  3078. → ★の しゅび力が 少し あがった!
  3079. → ★の しゅび力が 少し さがった!
  3080. → ★の しゅび力アップの 効果延長!
  3081. → ★の しゅび力ダウンの 効果延長!
  3082. → ★の どうぐの効果が もとにもどった!
  3083. → ★の どうぐ効果範囲が もとにもどった!
  3084. → ★の みりょくが あがった!
  3085. → ★の みりょくアップの 効果延長!
  3086. → ★の アタマは こんらんした!
  3087. → ★の カウンター!
  3088. → ★の キラキラポーンが きえた。
  3089. → ★の キラキラ効果が 悪い効果を はらいのけた!
  3090. → ★の コマンド間隔が かなり 短くなった!
  3091. → ★の コマンド間隔が かなり 長くなった!
  3092. → ★の コマンド間隔が もとにもどった!
  3093. → ★の コマンド間隔が 少し 短くなった!
  3094. → ★の コマンド間隔が 少し 長くなった!
  3095. → ★の コマンド間隔延長の 効果延長!
  3096. → ★の コマンド間隔短縮の 効果延長!
  3097. → ★の シビれが きえた!
  3098. → ★の チャージ時間が もとにもどった!
  3099. → ★の テンションが 100あがった!
  3100. → ★の テンションが 20あがった!
  3101. → ★の テンションが 50あがった!
  3102. → ★の テンションが 5あがった!
  3103. → ★の テンションが もとにもどった。
  3104. → ★の テンションは あがらなかった!
  3105. → ★の ブレス耐性が かなり あがった!
  3106. → ★の ブレス耐性が 少し あがった!
  3107. → ★の ブレス耐性アップの 効果延長!
  3108. → ★の ラピッドステッキの効果が きえた!
  3109. → ★の リベホイムのHP回復が おわった!
  3110. → ★の 会心と呪文ぼうそう率が あがった!
  3111. → ★の 会心と呪文ぼうそう率が もとにもどった。
  3112. → ★の 会心ガードが きえた。
  3113. → ★の 会心完全ガード!
  3114. → ★の 呪いが とけた!
  3115. → ★の 呪文の回復力が かなり あがった!
  3116. → ★の 呪文の回復力が もとにもどった!
  3117. → ★の 呪文の回復量増加の 効果延長!
  3118. → ★の 呪文の威力が かなり あがった!
  3119. → ★の 呪文の威力が もとにもどった!
  3120. → ★の 呪文の威力が 少し さがった!
  3121. → ★の 呪文の耐性が もとにもどった!
  3122. → ★の 呪文耐性が かなり あがった!
  3123. → ★の 呪文耐性が かなり さがった!
  3124. → ★の 呪文耐性が 少し あがった!
  3125. → ★の 呪文耐性が 少し さがった!
  3126. → ★の 呪文耐性アップの 効果延長!
  3127. → ★の 呪文耐性ダウンの 効果延長!
  3128. → ★の 天使の守りが きえた。
  3129. → ★の 姿が もとにもどった!
  3130. → ★の 幻惑が とけた!
  3131. → ★の 攻撃時 HP回復が きえた!
  3132. → ★の 盾ガード率が もとにもどった!
  3133. → ★の 聖女の守りが きえた。
  3134. → ★の 重さが ふえた!
  3135. → ★の 重さが もとにもどった!
  3136. → ★の 重さアップの 効果延長!
  3137. → ★の HPが 100回復した!
  3138. → ★の MPが 0回復した!
  3139. → ★の MPを 0うばった!
  3140. → ★の最大HPが ふえた!
  3141. → ★の最大MPが ふえた!
  3142. → ★は 100のダメージを うけた!
  3143. → ★は うけるダメージと 与えるダメージが 少なくなった。
  3144. → ★は からだが シビれた!
  3145. → ★は こうげきを かわしやすくなった!
  3146. → ★は さらに まぼろしに つつまれた!
  3147. → ★は しんでしまった。
  3148. → ★は すっころんだ!
  3149. → ★は すばやく 呪文を となえられる!
  3150. → ★は とりはだが たってしまった!
  3151. → ★は どうぐの効果が 倍になった!
  3152. → ★は どうぐの効果が 範囲になった!
  3153. → ★は ねむってしまった!
  3154. → ★は ひらりと 身をかわした!
  3155. → ★は ふっとばされた!
  3156. → ★は まぼろしに つつまれた!
  3157. → ★は もうどくに おかされた!
  3158. → ★は もらえる経験値が ふえた!
  3159. → ★は やいばのぼうぎょで 身を守った。
  3160. → ★は われにかえった!
  3161. → ★は ターン消費しなかった!
  3162. → ★は テンションが さがらなかった!
  3163. → ★は マホトラのころもを 身にまとった!
  3164. → ★は ムッチーノに変化した!
  3165. → ★は 仲間モンスターとの 絆を感じた!
  3166. → ★は 会心攻撃で うけるダメージが少なくなった。
  3167. → ★は 呪いを ふりはらった!
  3168. → ★は 呪われてしまった!
  3169. → ★は 天使の守りを 受けた!
  3170. → ★は 女神の祝福を 受けた!
  3171. → ★は 小さくなってしまった!
  3172. → ★は 少しずつ HPが回復する!
  3173. → ★は 必殺技が使えるようになった!
  3174. → ★は 悪い効果に かかりにくくなった!
  3175. → ★は 攻撃時に HPが回復するようになった!
  3176. → ★は 最大HP大ダウンの 呪いにかかった!
  3177. → ★は 最大HP小ダウンの 呪いにかかった!
  3178. → ★は 生き返った!
  3179. → ★は 目が くらんだ!
  3180. → ★は 目を さました!
  3181. → ★は 盾で こうげきを はじきかえした!
  3182. → ★は 盾で ガードしやすくなった!
  3183. → ★は 聖女の守りを 受けた!
  3184. → ★は 身をかわしやすくなった!
  3185. → ★は MPを消費しなかった!
  3186. ★が おむつっこりと 戦闘開始!
  3187. ★が まもののむれと 戦闘開始!
  3188. ★が ウッディアイたちと 戦闘開始!
  3189. ★が ウッディアイと 戦闘開始!
  3190. ★が デスパロットたちと 戦闘開始!
  3191. ★が デスパロットと 戦闘開始!
  3192. ★が ブラックチャックたちと 戦闘開始!
  3193. ★が ブラックチャックと 戦闘開始!
  3194. ★が プークプックと 戦闘開始!
  3195. ★が ミイラ男たちと 戦闘開始!
  3196. ★が リザードマンと 戦闘開始!
  3197. ★が 戦闘に参加した!
  3198. ★たちは ぜんめつした。
  3199. ★の かぶと割り!
  3200. ★の こうげき力が もとにもどった!
  3201. ★の こうげき力が 少し あがった!
  3202. ★の こうげき!
  3203. ★の しゅび力が もとにもどった!
  3204. ★の すてみ!
  3205. ★の たいあたり!
  3206. ★の たいぼく斬!
  3207. ★の たたかいのビート!
  3208. ★の とうこん討ち!
  3209. ★の どうぐ倍化術!
  3210. ★の どうぐ効果範囲が もとにもどった!
  3211. ★の どうぐ範囲化術!
  3212. ★の ばくれつけん!
  3213. ★の ふういんのダンス!
  3214. ★の まじん斬り!
  3215. ★の みりょくが もとにもどった!
  3216. ★の もろば斬り!
  3217. ★の やいばくだき!
  3218. ★の やいばのぼうぎょ!
  3219. ★の よみがえり節!
  3220. ★の アクロバットスター!
  3221. ★の イオナズン!
  3222. ★の イオラ!
  3223. ★の エンドオブシーン!
  3224. ★の オノむそう!
  3225. ★の カオスエッジ!
  3226. ★の キアリー!
  3227. ★の キラキラポーンが きえた。
  3228. ★の キラキラポーン!
  3229. ★の キラージャグリング!
  3230. ★の コマンド間隔が もとにもどった!
  3231. ★の コマンド間隔が 少し 短くなった!
  3232. ★の ゴッドジャグリング!
  3233. ★の ゴールドフィンガー!
  3234. ★の サイクロンアッパー!
  3235. ★の ザオラル!
  3236. ★の ザメハ!
  3237. ★の シビれが きえた!
  3238. ★の シールドアタック!
  3239. ★の シールドブレイク!
  3240. ★の スカラ!
  3241. ★の スクルト!
  3242. ★の スタンショット!
  3243. ★の スペルガード!
  3244. ★の スリープダガー!
  3245. ★の ズッシード!
  3246. ★の タイガークロー!
  3247. ★の タナトスハント!
  3248. ★の チャージタックル!
  3249. ★の チャージ時間が 短くなった!
  3250. ★の ティンクルバトン!
  3251. ★の テンションが 20あがった!
  3252. ★の テンションが 50あがった!
  3253. ★の テンションが 5あがった!
  3254. ★の テンションが もとにもどった。
  3255. ★の テンションブースト!
  3256. ★の トラップジャマー!
  3257. ★の ドラムクラッシュ!
  3258. ★の ナイトメアファング!
  3259. ★の ハッスルダンス!
  3260. ★の バイシオン!
  3261. ★の ビッグシールド!
  3262. ★の ピオリム!
  3263. ★の ピンクタイフーン!
  3264. ★の ファランクスの効果が きえた!
  3265. ★の ファランクス!
  3266. ★の フバーハ!
  3267. ★の ブレス耐性が もとにもどった!
  3268. ★の プラズマリムーバー!
  3269. ★の プレートインパクト!
  3270. ★の ベホイミ!
  3271. ★の ベホイム!
  3272. ★の ベホマラー!
  3273. ★の ホイミ!
  3274. ★の ホーリーライト!
  3275. ★の ボケ!
  3276. ★の マジステッキ!
  3277. ★の マジックバリア!
  3278. ★の マヒャデドス!
  3279. ★の マヒャド!
  3280. ★の マホステが きえた。
  3281. ★の マホトラのころもが きえた!
  3282. ★の マホトラのころも!
  3283. ★の マホトラ!
  3284. ★の ミラクルブースト!
  3285. ★の メディカルデバイス!
  3286. ★の メラゾーマ!
  3287. ★の メラ!
  3288. ★の ライガークラッシュ!
  3289. ★の ラピッドステッキの効果が きえた!
  3290. ★の ラピッドステッキ!
  3291. ★の ラリホーマ!
  3292. ★の ランドインパクト!
  3293. ★の リベホイムのHP回復が おわった!
  3294. ★の リベホイム!
  3295. ★の ロストアタック!
  3296. ★の ヴァイパーファング!
  3297. ★の 一喝!
  3298. ★の 不撓不屈!
  3299. ★の 会心と呪文ぼうそう率が あがった!
  3300. ★の 会心と呪文ぼうそう率が もとにもどった。
  3301. ★の 会心まいしんラップ!
  3302. ★の 会心ガードが きえた。
  3303. ★の 会心ガード!
  3304. ★の 会心必中!
  3305. ★の 呪文の回復力が もとにもどった!
  3306. ★の 呪文の威力が もとにもどった!
  3307. ★の 呪文の耐性が もとにもどった!
  3308. ★の 回復のララバイ!
  3309. ★の 大きさが もとにもどった!
  3310. ★の 天下無双!
  3311. ★の 天使の守りが きえた。
  3312. ★の 天使の守り!
  3313. ★の 女神の祝福が きえた。
  3314. ★の 女神の祝福!
  3315. ★の 姿が もとにもどった!
  3316. ★の 幻惑が とけた!
  3317. ★の 強化ガジェット零式!
  3318. ★の 心頭滅却!
  3319. ★の 必殺技!
  3320. ★の 攻撃時 HP回復が きえた!
  3321. ★の 無心こうげき!
  3322. ★の 無念無想!
  3323. ★の 百花繚乱!
  3324. ★の 盾ガード率が もとにもどった!
  3325. ★の 真・やいばくだき!
  3326. ★の 真・オノむそう!
  3327. ★の 美しさに みがきがかかった!
  3328. ★の 聖なる祈り!
  3329. ★の 聖女の守りが きえた。
  3330. ★の 聖女の守り!
  3331. ★の 聖者の詩!
  3332. ★の 荒神の舞!
  3333. ★の 蒼天魔斬!
  3334. ★の 身かわし率が もとにもどった!
  3335. ★の 重さが ふえた!
  3336. ★の 重さが もとにもどった!
  3337. ★の 鉄甲斬!
  3338. ★の 魔力かくせい!
  3339. ★の 魔結界!
  3340. ★の先制攻撃!
  3341. ★は 1 G かくとく!
  3342. ★は 107 Pの経験値 7 G かくとく!
  3343. ★は 14066 Pの達人経験値をかくとく!
  3344. ★は 1のダメージを うけた!
  3345. ★は ★に ツッコミをいれた!
  3346. ★は ★を おうえんした!
  3347. ★は いやしそうを 使った!
  3348. ★は うけをねらって ボケた!
  3349. ★は おうぎのまいを 中断した。
  3350. ★は おたけびをあげた!
  3351. ★は おはらいを 中断した。
  3352. ★は おはらいをした!
  3353. ★は おむつっこりを やっつけた!
  3354. ★は けんじゃのせいすいを 使った!
  3355. ★は こんらんして おびえている。
  3356. ★は しんでしまった。
  3357. ★は すっぴんに もどった!
  3358. ★は せかいじゅの葉を 使った!
  3359. ★は たたかいのビートをうたった!
  3360. ★は どうぐ範囲化術を 中断した。
  3361. ★は ふういんのダンスをおどった!
  3362. ★は ぶきみなひかりを 中断した。
  3363. ★は まじん斬りを 中断した。
  3364. ★は まほうのせいすいを 使った!
  3365. ★は まほうの小ビンを 9個 使った!
  3366. ★は まほうの小ビンを 使った!
  3367. ★は まもののむれを やっつけた!
  3368. ★は むげんのさとりが 使えるようになった!
  3369. ★は やるきのジャーミィたちを やっつけた!
  3370. ★は よみがえり節をうたった!
  3371. ★は われにかえった!
  3372. ★は アゲハ乱舞を まいおどった!
  3373. ★は イオグランデが 使えるようになった!
  3374. ★は イオナズンを となえた!
  3375. ★は イオラを となえた!
  3376. ★は ウッディアイたちを やっつけた!
  3377. ★は ウッディアイを やっつけた!
  3378. ★は ウルベア魔神兵強たちを やっつけた!
  3379. ★は エンドオブシーンを 中断した。
  3380. ★は オノむそうを 中断した。
  3381. ★は キアリーを となえた!
  3382. ★は キャットリベリオ強を やっつけた!
  3383. ★は ゴールドフィンガーを 中断した。
  3384. ★は ザオラルを となえた!
  3385. ★は ザメハを となえた!
  3386. ★は スカラを となえた!
  3387. ★は スクルトを となえた!
  3388. ★は スクルトを 中断した。
  3389. ★は スタンショットが 使えるようになった!
  3390. ★は スペルガードが 使えるようになった!
  3391. ★は ズッシードを となえた!
  3392. ★は タイガークローを 中断した。
  3393. ★は タナトスハントを 中断した。
  3394. ★は ティンクルバトンが 使えるようになった!
  3395. ★は ティンクルバトンを 中断した。
  3396. ★は テンションバーンが 使えるようになった!
  3397. ★は デスパロットたちを やっつけた!
  3398. ★は ドルマドンが 使えるようになった!
  3399. ★は ハッスルダンスを おどった!
  3400. ★は ハッスルダンスを 中断した。
  3401. ★は バイシオンを となえた!
  3402. ★は バイシオンを 中断した。
  3403. ★は バランスパスタ★3を 使った!
  3404. ★は ピオリムを となえた!
  3405. ★は ピオリムを 中断した。
  3406. ★は ファランクスが 使えるようになった!
  3407. ★は フバーハを となえた!
  3408. ★は ブラックチャックたちを やっつけた!
  3409. ★は ブラックチャックを やっつけた!
  3410. ★は プラズマリムーバーを 中断した。
  3411. ★は プレートインパクトが 使えるようになった!
  3412. ★は プークプックを やっつけた!
  3413. ★は ヘルバトラー強を やっつけた!
  3414. ★は ベホイミを となえた!
  3415. ★は ベホイムを となえた!
  3416. ★は ベホマラーを となえた!
  3417. ★は ベホマラーを 中断した。
  3418. ★は ホイミを となえた!
  3419. ★は ホーリーライトが 使えるようになった!
  3420. ★は マジックバリアを となえた!
  3421. ★は マヒャデドスを となえた!
  3422. ★は マヒャドを となえた!
  3423. ★は マホトラを となえた!
  3424. ★は ミイラ男たちを やっつけた!
  3425. ★は ミラクルブーストが 使えるようになった!
  3426. ★は メラを となえた!
  3427. ★は メラゾーマを となえた!
  3428. ★は ライガークラッシュを 中断した。
  3429. ★は ラピッドステッキが 使えるようになった!
  3430. ★は ラリホーマを となえた!
  3431. ★は ランドインパクトを 中断した。
  3432. ★は リザードマンを やっつけた!
  3433. ★は リベホイムを となえた!
  3434. ★は 会心まいしんラップをうたった!
  3435. ★は 全身に ちからを ためた!
  3436. ★は 呪いで うごけない!
  3437. ★は 呪術師マリーン強を やっつけた!
  3438. ★は 回復のララバイを 中断した。
  3439. ★は 回復のララバイをうたった!
  3440. ★は 天下無双を 中断した。
  3441. ★は 天使の守りを 受けた!
  3442. ★は 天魔クァバルナ強たちを やっつけた!
  3443. ★は 女神の祝福が 使えるようになった!
  3444. ★は 守護者ラズバーン強を やっつけた!
  3445. ★は 復活の杖が 使えるようになった!
  3446. ★は 心頭滅却を 中断した。
  3447. ★は 怪蟲アラグネ強を やっつけた!
  3448. ★は 悪い効果に かかりにくくなった!
  3449. ★は 悪夢の右手強を やっつけた!
  3450. ★は 悪魔長ジウギスを やっつけた!
  3451. ★は 戦いをやめた。
  3452. ★は 戦うのをやめた。
  3453. ★は 暴君バサグランデ強を やっつけた!
  3454. ★は 水竜ギルギッシュ強を やっつけた!
  3455. ★は 特訓スタンプを 12 個 かくとく!
  3456. ★は 特訓スタンプを 23 個 かくとく!
  3457. ★は 真・オノむそうを 中断した。
  3458. ★は 破戒王ベルムド強を やっつけた!
  3459. ★は 磁界シールドを つくりだした!
  3460. ★は 聖女の守りを 中断した。
  3461. ★は 聖女の守りを 受けた!
  3462. ★は 花ふぶきを まきおこした!
  3463. ★は 蒼天魔斬を 中断した。
  3464. ★は 覚醒プスゴンを やっつけた!
  3465. ★は 超暴走魔法陣が 使えるようになった!
  3466. ★は 身をかわしやすくなった!
  3467. ★は 魔人エンラージャ強を やっつけた!
  3468. ★は 魔軍師イッド強を やっつけた!
  3469.  
  3470. ★の ファイアフォース!
  3471. ★は 炎のチカラを 身にまとった!
  3472. ★の ファイアフォースの 効果時間延長!
  3473. ★の ファイアフォースが とけた!
  3474.  
  3475. ★の アイスフォース!
  3476. ★は 氷のチカラを 身にまとった!
  3477. ★の アイスフォースの 効果時間延長!
  3478.  
  3479. ★の ストームフォース!
  3480. ★は 風と雷のチカラを 身にまとった!
  3481. ★の ストームフォースの 効果時間延長!
  3482.  
  3483. ★の ダークフォース!
  3484. ★は 闇と土のチカラを 身にまとった!
  3485. ★の ダークフォースの 効果時間延長!
  3486.  
  3487. ★の ライトフォース!
  3488. ★は 光のチカラを 身にまとった!
  3489. ★の ライトフォースの 効果時間延長!
  3490. ★の ライトフォースが とけた!
  3491.  
  3492. ★の メイクアップ!
  3493. ★の 美しさに みがきがかかった!
  3494. ★は すっぴんに もどった!
  3495.  
  3496. ★の マホターン!
  3497. ★の マホカンタ!
  3498. ★の前に 光のカベが あらわれた!
  3499.  
  3500.  
  3501. EndTextBlock
  3502. //↑ここまでコメント扱い
Add Comment
Please, Sign In to add comment