既に回答出てますが・・・
敵味方に識別用のIDを付ける
今回は初期キャラデータの順番をIDにしてる
素早さを一つの配列に纏める
同時に通し番号を付ける
ソートするのは通し番号の配列のみ
味方早=1,3,5 //素早さが味方ID順に並んでるとする
味方数=3
味方PT=0,1,2
敵早=2,4,6 //素早さが敵ID順に並んでるとする
敵数=3 //敵出現数
敵GP=0,1,2
pos 0,0
mes "ソート前"
no=0
repeat 味方数 //敵味方を統合し通し番号を付ける
統合no(no)=no //要素数を通し番号とする
ID=味方PT(cnt)
統合早(no)=味方早(ID) //一つの配列に素早さを纏める
mes strf("%.9s%2d %8s%d %8s%d","統合no=",no,"味方ID=",ID,"味方早=",味方早(ID))
no++
loop
no=味方数
repeat 敵数 //敵味方を統合し通し番号を付ける
統合no(no)=no //要素数を通し番号とする
ID=敵GP(cnt)
統合早(no)=敵早(ID) //一つの配列に素早さを纏める
mes strf("%.9s%2d %8s%d %8s%d","統合no=",no,"敵ID=",ID,"敵早=",敵早(ID))
no++
loop
統合数=no
//ソート
repeat limit(統合数-1,0,統合数)//一つ下のと比較するので-1
noA=統合no(cnt)//上から順番に通し番号を取り出し
noB=統合no(cnt+1)
早A=統合早(noA)//通し番号を要素数として素早さ取り出し
早B=統合早(noB)
if 早A<早B {
統合no(cnt)=noB
統合no(cnt+1)=noA
continue 0 //入れ替えが有ったので最初から比較開始
}
loop
color 200
mes "ソート後"
repeat 統合数
no=統合no(cnt)
if no<味方数 {//味方数未満は味方を表し、味方PT(no)で味方のIDを取得出来る
//ここが味方処理(味方数〜統合数-1までの数が統合敵noになる)
味方ptno=no
mes strf("%.9s%2d %8s%d %8s%d","統合no=",no,"味方ID=",味方PT(味方ptno),"味方早=",統合早(no))
}else{//味方数以上は敵を表し、敵GP(no-味方数)で敵のIDを取得出来る
//ここが敵処理(0〜味方数-1までの数が統合味方noになる)
敵gpno=no-味方数
mes strf("%.9s%2d %8s%d %8s%d","統合no=",no,"敵ID=",敵GP(敵gpno),"敵早=",統合早(no))
}
loop
これを実際にゲームで使う感じにすると
randomize
味方名="仲間A","仲間B","仲間C","仲間D","仲間E"
味方HP=300,200,150,80,123,243
味方早=1,3,5,4,10 //素早さが味方ID順に並んでるとする
味方数=3
味方PT=0,2,4
敵名="敵A","敵B","敵C","敵D","敵E","敵F","敵G","敵H"
敵HP=310,123,243,100,200,150,245,213
敵早=2,4,6,1,5,3,4,7 //素早さが敵ID順に並んでるとする
pos 500,0
button gosub "リセット",*label
*start
color 255,255,255
boxf
color
dim 敵重複数,20
敵数=rnd(4)+2 //敵出現数
repeat 敵数
ID=rnd(length(敵早))
敵GP(cnt)=ID
敵重複数(ID)++ //同じ種類の敵を数える
loop
pos 0,0
mes "ソート前"
no=0
repeat 味方数 //敵味方を統合し通し番号を付ける
統合no(no)=no //要素数を通し番号とする
ID=味方PT(cnt)
統合名(no)=味方名(ID)
統合早(no)=味方早(ID)
mes strf("%.9s%2d %8s%d %8s%d %8s","統合no=",no,"味方ID=",ID,"味方早=",味方早(ID),味方名(ID))
no++
loop
repeat 敵数 //IDを一つの配列に統合
統合no(no)=no //要素数を通し番号とする
ID=敵GP(cnt)
idcnt=敵重複数(ID)
if idcnt>1 {//同種が2以上なので名前に番号を付ける
idcnt+$100 //元の数を壊したくないので$100を足して番号にする(番号として使うときは$100で割る)
統合名(no)=敵名(ID)+"("+(idcnt/$100)+")"
敵重複数(ID)=idcnt
}else{
統合名(no)=敵名(ID)
}
統合早(no)=敵早(ID)
mes strf("%.9s%2d %8s%d %8s%d %8s","統合no=",no,"敵ID=",ID,"敵早=",敵早(ID),敵名(ID))
no++
loop
統合数=no
dim 統合HP,統合数
//ソート
repeat 統合数-1
noA=統合no(cnt)
noB=統合no(cnt+1)
早A=統合早(noA)
早B=統合早(noB)
if 早A<早B {
統合no(cnt)=noB
統合no(cnt+1)=noA
continue 0
}
loop
color 255
mes "ソート後"
cposx=ginfo_cx
cposy=ginfo_cy
repeat
tagno=-1
redraw 0
color 220,230,220
boxf 0,cposy,640,480
repeat 統合数
if (sel_index=cnt) {color 200}else{color 200,100,255}
pos cposx,cposy+16*cnt
no=統合no(cnt)
if no<味方数 {//味方数未満は味方を表し、味方PT(no)で味方のIDを取得出来る
//ここが味方処理
味方ptno=no
ID=味方PT(味方ptno)
HP=(味方HP(ID)-統合HP(no))
if HP>0 {
mes strf("%.9s%2d %8s%d %8s%d %8s","統合no=",no,"味方ID=",ID,"味方早=",統合早(no),統合名(no))
if (sel_index=cnt) {
color 0,100,255
}else{
if abs((味方ptno*100+50)-mousex+35)<50 and (abs(430-mousey+20)<30) {
color 200,0,100
tagno=no
}else{
color 0,0,150
}
}
pos 味方ptno*100+50,430
mes "名前:"+統合名(no)
mes "HP:"+HP+"/"+味方HP(ID)
}else{ //HP0以下
if sel_index=cnt {sel_index++} //既に死んでるので次のnoに移動
}
}else{//味方数以上は敵を表し、敵GP(no-味方数)で敵のIDを取得出来る
//ここが敵処理
敵gpno=no-味方数
ID=敵GP(敵gpno)
HP=(敵HP(ID)-統合HP(no))
if HP >0 {
mes strf("%.9s%2d %8s%d %8s%d %8s","統合no=",no,"敵ID=",ID,"敵早=",統合早(no),統合名(no))
if (sel_index=cnt) {
color 0,100,255
}else{
if abs((敵gpno*100+50)-mousex+35)<50 and (abs(370-mousey+20)<30) {
color 200,0,100
tagno=no
}else{
color 0,0,150
}
}
pos 敵gpno*100+50,370
mes "名前:"+統合名(no)
mes "HP:"+HP+"/"+敵HP(ID)
}else{//HP0以下
if sel_index=cnt {sel_index++} //既に死んでるので次のnoに移動
}
}
loop
redraw 1
await 16
stick st
if st&512 {sel_index++}//右クリックで次のnoを選択
if (st&256)>0 and tagno>=0{//左クリックでタッゲートにダメージを与える
dmg=rnd(25)+5
統合HP(tagno)+dmg
title "ターゲットNO="+tagno+" "+統合名(tagno)+" ダメージ="+dmg
}
sel_index=sel_index\統合数
if loopexit {break}
loop
loopexit=0
sel_index=0
tagno=0
goto *start
stop
*label
loopexit=1
return