;━━━━━━━━━━━━━━━━━━━━
; PC、NPC、オブジェなど
;━━━━━━━━━━━━━━━━━━━━
*キャラとイベント
;-------移動処理-------
if movecnt(0)=0{
if key&15 {
//縦横移動
repeat 1
// 左:1, 上:2, 右:4, 下:8
if key&1:movex(0)=-1:cd(0)=0:pd=0:break
if key&2:movey(0)=-1:cd(0)=1:pd=1:break
if key&4:movex(0)=1:cd(0)=2:pd=2:break
if key&8:movey(0)=1:cd(0)=3:pd=3:break
loop
}else{
if dash=1 : dash=0
}
;プレイヤーの1歩先を調べる為の変数
if pd=0:ttx=-1:tty=0
if pd=1:ttx=0:tty=-1
if pd=2:ttx=1:tty=0
if pd=3:ttx=0:tty=1
}
;全イベント移動と当たり判定
repeat evntmax
;PCは除外
if cnt>=pt{ ;ここから---------------------------------------
;移動中ならチェックからはずす
if (movecnt(cnt)=0){
;動くNPC
if (ct(cnt)=1){
;ランダム歩行
if 0=rnd(100){
tmp=rnd(4)
if tmp=0:movex(cnt)=-1:cd(cnt)=0
if tmp=1:movey(cnt)=-1:cd(cnt)=1
if tmp=2:movex(cnt)=1:cd(cnt)=2
if tmp=3:movey(cnt)=1:cd(cnt)=3
}else{
;話かけた時
if (xkey=1)and(px+ttx=cx(cnt))and(py+tty=cy(cnt)){
logmes "イベント起動"+(cnt-pt)
evntnumline=(cnt-pt)
;イベントの向き変更
if cx(cnt)=px{
;上下の判定
if tty=-1{
cd(cnt)=3
}else{
cd(cnt)=1
}
}else{
;左右の判定
if ttx=-1{
cd(cnt)=2
}else{
cd(cnt)=0
}
}
;イベント開始
evnttype=1
;イベントページ番号
if cnt=1{
evntline=evntnum(evntnow(cnt-pt))+3
}else{
evntline=0
repeat cnt-pt
evntline+=evntpage(cnt)
loop
logmes ""+evntline
evntline=evntnum(evntline+evntnow(cnt-pt))+3
}
}
}
}
;動かないNPC
if (ct(cnt)=2){
;話かけた時
if (xkey=1)and(px+ttx=cx(cnt))and(py+tty=cy(cnt)){
logmes "イベント起動"+(cnt-pt)
evntnumline=(cnt-pt)
;イベントの向き変更
if cx(cnt)=px{
;上下の判定
if tty=-1{
cd(cnt)=3
}else{
cd(cnt)=1
}
}else{
;左右の判定
if ttx=-1{
cd(cnt)=2
}else{
cd(cnt)=0
}
}
;イベント開始
evnttype=1
;イベントページ番号
if cnt=1{
evntline=evntnum(evntnow(cnt-pt))+3
}else{
evntline=0
repeat cnt-pt
evntline+=evntpage(cnt)
loop
evntline=evntnum(evntline+evntnow(cnt-pt))+3
}
}
}
};if (movecnt(cnt)=0)
;重なると発動するイベント
if (ct(cnt)=3){
;キャラとの当たり判定
if (cx(cnt)=px)and(cy(cnt)=py)and(movestop=0){
logmes "イベント起動"+(cnt-pt)
evntnumline=(cnt-pt)
;起動中のイベントID保存
evnt_id=cnt
;重なりの2重起動禁止
movestop=1
;イベント開始
evnttype=1
;イベントページ番号
if cnt=1{
evntline=evntnum(evntnow(cnt-pt))+3
}else{
evntline=0
repeat cnt-pt
evntline+=evntpage(cnt)
loop
evntline=evntnum(evntline+evntnow(cnt-pt))+3
}
}
}
;オブジェクト
if (ct(cnt)=4){
;X押した時
if (xkey=1)and(px+ttx=cx(cnt))and(py+tty=cy(cnt)){
logmes "イベント起動"+(cnt-pt)+":"+(evntnow(cnt-pt))
evntnumline=(cnt-pt)
;起動中のイベントID保存
evnt_id=cnt
;イベント開始
evnttype=1
;イベントページ番号
if cnt=1{
evntline=evntnum(evntnow(cnt-pt))+3
}else{
evntline=0
repeat cnt-pt
evntline+=evntpage(cnt)
logmes ""+evntpage(cnt)
loop
evntline=evntnum(evntline+evntnow(cnt-pt))+3
}
logmes ""+evntline
}
}
;向きを上で設定=プレイヤーが上向きから・調べるのみで反応するオブジェクト
if (ct(cnt)=6){
;X押した時
if (cd(cnt)=pd)and(xkey=1)and(px+ttx=cx(cnt))and(py+tty=cy(cnt)){
logmes "イベント起動"+(cnt-pt)+":"+(evntnow(cnt-pt))
evntnumline=(cnt-pt)
;起動中のイベントID保存
evnt_id=cnt
;イベント開始
evnttype=1
;イベントページ番号
if cnt=1{
evntline=evntnum(evntnow(cnt-pt))+3
}else{
evntline=0
repeat cnt-pt
evntline+=evntpage(cnt)
logmes ""+evntpage(cnt)
loop
evntline=evntnum(evntline+evntnow(cnt-pt))+3
}
logmes ""+evntline
}
}
};ここまでNPC---------------------------------------
;★プレイヤーの移動&NPCとオブジェクト画像、通過NPC
if (ct(cnt)=1)or(ct(cnt)=2)or(ct(cnt)=5) {
//キャラのマップ端の当たり判定
if cx(cnt)+movex(cnt)<=-1 :movex(cnt)=0
if cy(cnt)+movey(cnt)<=-1 :movey(cnt)=0
if cx(cnt)+movex(cnt)>((size_x-1)*CHIP)+1 : movex(cnt)=0
if cy(cnt)+movey(cnt)>((size_y-1)*CHIP)+1 : movey(cnt)=0
;マップとの当たり判定
gsel 4
pget (cx(cnt)+movex(cnt))*CHIP,(cy(cnt)+movey(cnt))*CHIP
if (debug_hit=0)and(ginfo(16)=0){
movex(cnt)=0
movey(cnt)=0
}
;自分以外の他のキャラとの当たり判定
;tmp=自分のID
tmp=cnt
repeat evntmax
;後ろの仲間は通り抜けできるようにする
if (tmp<PT) : if ct(chr_t(tmp))=5 : break
if (tmp=cnt) : continue
;当たり判定のあるイベントタイプの場合進めない
;画像がある時の処理
;if (cg(cnt)!=0){
;床イベントと画像ナシ以外はぶつかる
;後ろの仲間は通り抜けできるようにする
if cnt<PT {
if (ct(chr_t(cnt))!=5){
if (cg(chr_t(cnt))!=0) :if ((cx(tmp)+movex(tmp))=(cx(chr_t(cnt))+movex(chr_t(cnt))))and((cy(tmp)+movey(tmp))=(cy(chr_t(cnt))+movey(chr_t(cnt)))):movex(tmp)=0:movey(tmp)=0
}
}else{
if (ct(cnt)!=0)and(ct(cnt)!=5)and((ct(cnt)!=3)) {
if (cg(cnt)!=0) :if ((cx(tmp)+movex(tmp))=(cx(cnt)+movex(cnt)))and((cy(tmp)+movey(tmp))=(cy(cnt)+movey(cnt))):movex(tmp)=0:movey(tmp)=0
}
}
loop
if movecnt(cnt)=0{
if (movex(cnt)!=0)or(movey(cnt)!=0) {
movecnt(cnt)=16
if cnt=0 {
;リザルト用
walk_res++
walk_res=limit(walk_res,0,2000000001)
}
if cnt=0 {
repeat pt-1,1
movex(cnt)=tmovex(cnt)
movey(cnt)=tmovey(cnt)
cd(cnt)=tcd(cnt)
movecnt(cnt)=16
loop
}
}
}
if movecnt(cnt)>0{
;walk_mode
;0=Normal
;1=Dash
;2=Maniac
if walk_mode<2 {
if cnt<pt{
if dash=1 {
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-1:tx(cnt)-=2
if movey(cnt)=-1:ty(cnt)-=2
if movex(cnt)=1:tx(cnt)+=2
if movey(cnt)=1:ty(cnt)+=2
movecnt(cnt)-=2
}else{
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-1:tx(cnt)-=1
if movey(cnt)=-1:ty(cnt)-=1
if movex(cnt)=1:tx(cnt)+=1
if movey(cnt)=1:ty(cnt)+=1
movecnt(cnt)-=1
}
}else{
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-1:tx(cnt)-=1
if movey(cnt)=-1:ty(cnt)-=1
if movex(cnt)=1:tx(cnt)+=1
if movey(cnt)=1:ty(cnt)+=1
movecnt(cnt)-=1
}
}else{
if cnt<pt{
if dash=1 {
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-16:tx(cnt)-=2
if movey(cnt)=-16:ty(cnt)-=2
if movex(cnt)=16:tx(cnt)+=2
if movey(cnt)=16:ty(cnt)+=2
movecnt(cnt)-=2
}else{
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-16:tx(cnt)-=1
if movey(cnt)=-16:ty(cnt)-=1
if movex(cnt)=16:tx(cnt)+=1
if movey(cnt)=16:ty(cnt)+=1
movecnt(cnt)-=1
}
}else{
// 左:1, 上:2, 右:4, 下:8
if movex(cnt)=-16:tx(cnt)-=1
if movey(cnt)=-16:ty(cnt)-=1
if movex(cnt)=16:tx(cnt)+=1
if movey(cnt)=16:ty(cnt)+=1
movecnt(cnt)-=1
}
}
if (movecnt(cnt)<=0)and(cmove(cnt)=0){
if cnt<pt {
;仲間移動
tmovex(cnt+1)=movex(cnt)
tmovey(cnt+1)=movey(cnt)
tcd(cnt+1)=cd(cnt)
}
if cnt=0{
px+=movex(cnt)
py+=movey(cnt)
if movestop=1:movestop=0
;エネミー遭遇
if mapenmmax!=0{
logmes encount
if (encount<=30+(encset*10))and(debug_encount=0) {
if encount>0 {
if (rnd(encount)=0) : enmmax=99
}else{
enmmax=99
}
}
if encount>1 {
repeat pt
if efc_drop(cnt)=0 : continue
encount-=efc_drop(cnt)
loop
encount--
encount=limit(encount,0,199)
}
}
;毒
repeat pt
raster_mode=0
if (sta(cnt,0)=2)or(sta(cnt,1)=0) : continue
;毒 ラスタースクロール
raster_mode=1
dcnt++ : break
loop
}
if cnt=pt-1 : if dash=1 : dash=0
cx(cnt)+=movex(cnt)
cy(cnt)+=movey(cnt)
movex(cnt)=0
movey(cnt)=0
tx(cnt)=0
ty(cnt)=0
movecnt(cnt)=0
}
}
;イベント用自動歩行
if (cmove(cnt)!=0){
;logmes "自動歩行 ID( "+cnt+" ) 歩行数:"+cmove(cnt)+" 移動カウント:"+movecnt(cnt)
;"←\n↑\n→\n↓
if cd(cnt)=0:movex(cnt)=-1:tx(cnt)-=1
if cd(cnt)=1:movey(cnt)=-1:ty(cnt)-=1
if cd(cnt)=2:movex(cnt)=1:tx(cnt)+=1
if cd(cnt)=3:movey(cnt)=1:ty(cnt)+=1
;距離カウント
cmove(cnt)--
;移動カウント
movecnt(cnt)-=1
}
}
loop
return
repeatも使いようなのかなぁ