item_func.hsp

Last-modified: 2015-03-10 (火) 00:55:40

マップ内に気持ちいいことをしているキャラがいると0番のアイテムが使えない問題

112 名前:名無しさん@お腹いっぱい。[sage] 投稿日:12/01/08 20:24:13 ID:cipblfoQ

130:以下、名無しにかわりましてVIPがお送りします[] 2011/12/31(土) 09:41:08.87 ID:osu6Od0I(1)

昨日「そのアイテムは他の誰かが使用中だ」のバグで旅糧が食えねえよって書き込んだ者だけど、

原因?と回避方法分かったわ。

コンソールの"3"コマンドで持ち物リストを表示して、0の位置に食べ物系アイテムが入ってる場合、

その食べ物を、マップ内に気持ち良い事をしてるキャラが居る時に食おうとすると、

「そのアイテムは他の誰かが使用中だ」って表示されて食えない。

回避するには、該当の食べ物系アイテムを持ち物リストの0の位置から動かせば良い。

該当の食べ物を地面に置いて、インベントリにない適当な他のアイテムを拾えばおk

cdata(140,ユニットNo.) = 11:気持ちいいことのときは当然
cdata(142,ユニットNo.) : 継続行動使用中アイテムNoに0が入っているので0の位置に旅糧があると引っかかる
itemusingfindのあたりで11:気持ちいいことの場合を除外しておくのがいい気がする

 

冒険者の生成時にnovoidlv=1していないため
PCがすくつにいるときに引退→生成が起こった場合冒険者にすくつ補正がついてしまう

ランダムネフィアのボス生成時に中身の違うシェイドが選ばれた場合奇跡品質で生成されない
著しい問題があるわけではないので放置してもいいかも

地面にあるアイテムを鑑定して手元にスタックした時に重量の再計算が行われない問題

地面にあるアイテムを鑑定して手元にスタックした時に重量の再計算が行われないので、
item_stack内のcell_refreshのあたりで重量再計算のサブルーチンに飛ばすといいかもしれない

荷車の重量がオーバーフローする問題

荷車の重量がオーバーフローすることがある(らしい。未確認)ためinv_weightのところで
gdata(80) += inv(7, cnt) * inv(0, cnt) * (-1) となっているのを
gdata(80) += limit(inv(7, cnt) * inv(0, cnt) * (-1), 0, 10000000) みたいな感じでアイテム一種類あたりの重さを制限してやると良い?
何かもうちょっとスマートな対策があったら教えてください

スウォーム等で同時に殺害したキャラクターのドロップ品が同じものになってしまうことがある問題

s(1) = random_title(1) で武器の銘を代入した直後に randomize しているが、アニメーションをオフにしている場合など
非常に短い時間でこの部分を繰り返した場合は randomize の時間取得の精度の関係か乱数の種がすべて同じになってしまうのが原因
randomize timeGetTime() とすれば多分大丈夫

修正方法

item_func.hsp 597行目

	randomize iSubName(id)-headEgoTitleSp
	if iQuality(id)=fixGreat:s+=lang("『"," <")+random_title(1)+lang("』",">"):else:s+=lang("《"," {")+random_title(1)+lang("》","}")
	randomize

	randomize iSubName(id)-headEgoTitleSp
	if iQuality(id)=fixGreat:s+=lang("『"," <")+random_title(1)+lang("』",">"):else:s+=lang("《"," {")+random_title(1)+lang("》","}")
	randomize timeGetTime()

クーラーボックスやシェルターのデータが削除されないことがある問題

239 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 12:40:20.59 ID:KZcyku1m
修正方法まだ調べてないけど不具合をメモ代わりに投下

★クーラーボックスをどこかに置くなりしてなくした場合に対応する
インベントリ情報が格納されたファイルが削除されずにセーブデータに
残り続ける
内部処理的にはわが家で使用人を募集->(話しかけて在庫確定後)解雇で
在庫ファイルが消えないのと似てる

245 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 18:01:21.77 ID:zlLIltSh
シェルター設置したまま設置したMAP再生成なりするとシェルターのデータは残りっぱなしになるよ

247 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 18:46:16.77 ID:d8Qa9urR
シェルターはaction内の162~169行目(撤去時の処理)をitem_funcのitem_deleteにもコピペすればいいのかな
クーラーボックスはどこだろ

250 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 20:37:18.53 ID:KZcyku1m

>>245
あー、マップデータ残るのはその場合だけ…かな?
燃えたり、砕けたりはしないんだっけ?、シェルター
撤去時にマップデータ削除はしてるし、ただアイテムとして存在してる分には
結びついたマップデータは存在しないはずだからとりあえずは後回しでいいな

>>247
それ見て気付いたけどシェルター撤去時のマップデータ削除って中身気にせず
単純ファイル削除なんだよな…
つまり中にクーラーボックスがあった場合…

・セーブされないマップ(野外など)
・シェルター内(撤去時)
・街等のリニューアル有マップのリニューアル時
辺りで対処要るかな?

253 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 21:09:26.31 ID:d8Qa9urR
そういえば再生成するマップでは建設できないんだった
後は持たせて縁切りとか?

254 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2011/03/27(日) 21:35:30.85 ID:KZcyku1m
縁切りと同じようなもんだけど売り飛ばしとかもかな
これはchara_func.hsp内のdel_charaでinv掃除してるところ(iNum(cnt)=0)を
item_deleteに変えてitem_delete側で対処すれば良い気がする
んーっと…

#deffunc
 if (iFile(a) != 0) {
  invfile = exeDir@ + "tmp\\" + "shop" + iFile(a) + ".s2"
  exist invfile
  if ( strsize != -1 ) {
   delete invfile
   fileAdd invfile, 1
  }
 }
 memset inv@(0, a), 0, maxItem * sizeInt
 return
思いつきのてきとーだけどこんな感じ?多分
iIdでの判定もやっといたほうが確実かもー

127 名前:名無しさん@お腹いっぱい。[sage] 投稿日:12/03/17 21:25:18 ID:wVuBXJwE
・>>81のクーラーボックスの処理に付いて
item_func.hspのincludeがmodule.hspより先なので
fileAdd命令をこのまま書くと落ちる
include順を変えると別のところで問題が出るので

HSP開発wiki:ユーザー定義命令・関数の宣言と定義を分離して記述する(URL弾かれるので省略)
このページを参考にプロトタイプ宣言もどきを行って回避する

init.hspの末尾に

#module

#deffunc
goto *fileAddCore@defineFileAdd   ;@fileAddのモジュール空間名

#global

を追加し、

#module

#deffunc

*fileAddCore           ;モジュール内ラベルを追加
(略)

とする
さらにitem_delete内でのfileAdd→fileAddFakeとしておくと一応動いてはいるようだ

もっと賢い処理誰か教えてください