レベル上げ収穫用Stonescript

			
//レベル上げ収穫用Stonescript(未完成)
//
//最初は恐怖の洞窟をループして、
//レベル上げと宝箱を収穫する目的で作成
//
//主な処理は高速移動と収穫
//探索開始時の装備アイテムを記録して、
//状況により高速移動/収穫アイテムへの持ち替え/再装備
//
//その他、気になったいくつかの状況に対応
//なるべく汎用的にしたけど不完全

//履歴
//2023年08月09日 初出
//2023年08月10日 石虫、神殿ボス対策を追加
//2023年08月11日 六尺棒ダッシュを追加
//2023年08月22日 全体の処理を見直し。AAを追加
//2023年08月24日 敵の無限湧き対策を追加

//Special Thanks
//Introduction to the Mind Stone
//https://stonestoryrpg.com/stonescript/
//Stonescript Manual
//https://stonestoryrpg.com/stonescript/beta.html
//【Stone Story RPG】 ソウルストーン 一覧
//https://henamap.doorblog.jp/archives/21519398.html
//【Stone Story PRG】 枯木の渓谷の「石虫」に攻撃が当たらない →魔法・遠距離攻撃が無効です
//https://henamap.doorblog.jp/archives/82599442.html
//Steam コミュニティ :: ガイド :: 仕様やストーンスクリプト等(仮)
//https://steamcommunity.com/sharedfiles/filedetails/?id=3016395123

//格上の敵を倒せそうなAA
>h0,-8,#white,ascii
|
|
|
|
|
|
|
|
|
asciiend

//探索開始時の装備アイテムを記録
//アイテムは状況ごとに四次元ベルトを利用するのが楽だけど汎用性がなくなる
//そんな装備で大丈夫か?
var beginItemRight = item.right
var beginItemLeft = item.left

//メッセージ
var message

//アイテムを持ち替えたか? true:はい false:いいえ
var isChangeItem

var screenI = screen.i
var posX = pos.x
var slowdown = time.ms

//敵の無限湧き
var infiniteFoe = false

var debuffsCount = debuffs.count

//右手アイテムを持ち替える
func changeItemRight(target)
  isChangeItem = true
  ?item.right ! target
    //両手アイテム対策
    //片手アイテムの場合、右手に装備される
    equip = @target@

//左手アイテムを持ち替える
func changeItemLeft(target)
  isChangeItem = true
  ?item.left ! target
    equipL = @target@

//アイテムをアクティブ化
func activateItem(target)
  //アイテム全般をアクティブ化できる状況か?
  ?item.CanActivate() 
    //クールダウンが0
    ?item.GetCooldown(target) = 0
      //装備
      changeItemRight(target)
      //指定アクティブ化できる状況か?
      ?item.CanActivate(target)
        //アクティブ化
        activate R
        return true
  return false

//ポーションをアクティブ化
func activatePotion(target)
  //指定ポーションが存在するか?
  ?item.potion = target
    //アクティブ化
    activate potion
      return true
  return false

//フレームごとに実行される

//初期化
isChangeItem = false
message = ""

//状況確認

//必要なポーションを生成して釜の自動補充オンにしておく

//HPが10未満
?hp < 10
  //HPポーションをアクティブ化
  ?activatePotion(healing) 
    message = "HPポーションで全回復"

//デバフカウントが25超え
//主に神殿ボス対策
?debuffs.count >= 30
  //浄化ポーションをアクティブ化
  ?activatePotion(cleansing) 
    message = "浄化ポーションでデバフ消去"

//キャラが移動
?posX ! pos.x
  slowdown = time.ms
posX = pos.x

//画面が移動
?screenI ! screen.i
  //無限湧き解除
  infiniteFoe = false
screenI = screen.i

//46ユニット内に敵が存在する
?foe.count > 0

  //ボス
  ?foe = boss
    //ボスごとの攻略を書く

    //神殿
    ?foe = nagaraja
      //間合いまで近づく
      ?foe.distance > 10
        message = "トリスケルの石で速度アップ"
        changeItemLeft(triskelion_stone)
        changeItemRight(shield)
      //デバフを受けた
      :?debuffs.count > debuffsCount
        message = "明瞭の石で数歩後ずさる"
        //運が良ければ次弾を回避
        //次発動するのは12秒後
        changeItemLeft(mind_stone)
        //アイテムを戻す
        changeItemLeft(beginItemLeft)
        changeItemRight(beginItemRight)

    //ボスHPが50未満
    :?foe.hp < 50
      //左手にアイテムがない
      ?!beginItemLeft
        //攻撃力不足になるので何もしない
        isChangeItem = isChangeItem
      :
        message = "経験の石で経験値アップ"
        changeItemRight(xp_stone)

  //敵ごとの攻略を書く
  :
    //同じ場所に12秒以上
    ?(time.ms-slowdown)/1000 > 12
      //無限湧き発動
      infiniteFoe = true
      message = "明瞭の石で数歩後ずさる"
      //次発動するのは12秒後
      changeItemLeft(mind_stone)

    //石虫
    :?foe = scarab
      //石虫に当たる手持ちアイテムの選別が面倒
      //エリアの星が増えるとソウルストーンでは倒せない
      message = "ソウルストーンで攻撃"
      changeItemRight(xi_stone)
      changeItemRight(xp_stone)

//46ユニット内に敵が存在しない
:
  //無限湧き解除
  infiniteFoe = false

  //HPが最大未満
  ?hp < maxhp
    message = "ウロボロスの石でHP回復"
    changeItemRight(ouroboros_stone)
  //ピックアップが存在
  :?pickup.distance <= 20
    message = "星の石でピックアップを吸着。氣の石で収穫アップ"
    changeItemRight(star_stone)
    changeItemLeft(xi_stone)
  //収穫物が存在
  :?harvest.distance <= 10
    //岩が存在
    ?harvest = Boulder 
      message = "ショベルで岩を収穫"
      changeItemRight(shovel)
    //木が存在
    :?harvest = tree
      message = "手斧で木を収穫。氣の石で収穫アップ"
      changeItemRight(hatchet)
      changeItemLeft(xi_stone)
  //六尺棒でダッシュ
  :?activateItem(quarterstaff)
    message = "六尺棒でダッシュ"
  //ダッシュできなかった
  :
    message = "トリスケルの石で速度アップ"
    changeItemLeft(triskelion_stone)

debuffsCount = debuffs.count

//敵の無限湧き対策
//画面内でダッシュ系装備に固定
?infiniteFoe
  message = "無限湧き発動"
  //左手(攻撃)アイテム
  changeItemLeft(beginItemLeft)
  //左手にアイテムがない(両手アイテム?)
  ?!beginItemLeft
    //六尺棒でダッシュ攻撃
    activateItem(quarterstaff)
  :
    //ダッシュ盾
    changeItemRight(dashing)

//アイテムの持ち替えなし
?isChangeItem = false
  //左手アイテムを戻す
  changeItemLeft(beginItemLeft)
  //右手アイテムを戻す
  changeItemRight(beginItemRight)

//左上に各種情報を表示
>`0,4,itemR=@item.right@
>`0,5,itemL=@item.left@
>`0,6,potion=@item.potion@
>`0,7,loc=@loc.id@
>`0,8,pickup=@pickup.distance@,@pickup@
>`0,9,harvest=@harvest.distance@,@harvest@
>`0,10,foe=@foe.distance@,@foe@
>`0,11,debuff=@debuffs.count@,@debuffs.string@
>`0,12,slowdown=@(time.ms-slowdown)/1000@
>`0,13,mess=@message@