;━━━━━━━━━━━━━━━━━━━━
; 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も使いようなのかなぁ