First Commit : Lode Runner v0.99k.1
@@ -1,4 +1,6 @@
|
||||
LodeRunner
|
||||
==========
|
||||
[Lode Runner (超級運動員)](http://simonsays-tw.com/LodeRunner)
|
||||
==========================
|
||||
|
||||
Lode Runner (超級運動員) - APPLE-II remake version (HTML5, JavaScript) http://simonsays-tw.com/LodeRunner
|
||||
This program build with Javascript + [CreateJS](http://www.createjs.com).
|
||||
|
||||
------------------------------------
|
||||
|
||||
|
Après Largeur: | Hauteur: | Taille: 326 B |
|
Après Largeur: | Hauteur: | Taille: 326 B |
|
Après Largeur: | Hauteur: | Taille: 188 B |
|
Après Largeur: | Hauteur: | Taille: 188 B |
|
Après Largeur: | Hauteur: | Taille: 5.7 KiB |
|
Après Largeur: | Hauteur: | Taille: 51 KiB |
|
Après Largeur: | Hauteur: | Taille: 6.3 KiB |
|
Après Largeur: | Hauteur: | Taille: 18 KiB |
|
Après Largeur: | Hauteur: | Taille: 147 B |
|
Après Largeur: | Hauteur: | Taille: 2.8 KiB |
|
Après Largeur: | Hauteur: | Taille: 148 B |
|
Après Largeur: | Hauteur: | Taille: 131 B |
|
Après Largeur: | Hauteur: | Taille: 2.6 KiB |
|
Après Largeur: | Hauteur: | Taille: 190 B |
|
Après Largeur: | Hauteur: | Taille: 32 KiB |
|
Après Largeur: | Hauteur: | Taille: 163 B |
|
Après Largeur: | Hauteur: | Taille: 1.7 KiB |
|
Après Largeur: | Hauteur: | Taille: 163 B |
|
Après Largeur: | Hauteur: | Taille: 191 B |
|
Après Largeur: | Hauteur: | Taille: 288 B |
|
Après Largeur: | Hauteur: | Taille: 1.4 KiB |
|
Après Largeur: | Hauteur: | Taille: 856 B |
|
Après Largeur: | Hauteur: | Taille: 16 KiB |
|
Après Largeur: | Hauteur: | Taille: 316 B |
|
Après Largeur: | Hauteur: | Taille: 118 B |
|
Après Largeur: | Hauteur: | Taille: 2.1 KiB |
|
Après Largeur: | Hauteur: | Taille: 183 B |
|
Après Largeur: | Hauteur: | Taille: 177 B |
|
Après Largeur: | Hauteur: | Taille: 198 B |
|
Après Largeur: | Hauteur: | Taille: 3.8 KiB |
|
Après Largeur: | Hauteur: | Taille: 163 B |
|
Après Largeur: | Hauteur: | Taille: 1.2 KiB |
@@ -0,0 +1,979 @@
|
||||
//************************************************************
|
||||
//* All levels extract from:
|
||||
//* Championship Lode Runner (Apple-II 1984) DISK IMAGE
|
||||
//* by Simon Hung 2014/02/20
|
||||
//*
|
||||
//* "level 51" : Championship demo level (2014/04/27)
|
||||
//************************************************************
|
||||
|
||||
var levelData2 = [
|
||||
//======<<< Level 001 >>>======
|
||||
|
||||
" " +
|
||||
"H--------------------------H" +
|
||||
"H $ $ $$$$ $ $ $$ H" +
|
||||
"H $ $ $ $ $ $ $ H" +
|
||||
"H $$$$ $$$ $ $ $ $ H" +
|
||||
"H $ $ $ $ $ $ $ H" +
|
||||
"H $ $ $$$$ $$$$ $$$$ $$ H" +
|
||||
"H 0 0H" +
|
||||
"H--HHH---HHH---HHH--HHHH---H" +
|
||||
"H&S S S S S S S S H" +
|
||||
"H#H# S S S S S H##H" +
|
||||
"H#S #HH S S S S S###S #H" +
|
||||
"H#S S#H# S S H#H S #H" +
|
||||
"H# SSSS SHH#$$HHH SSSS #H" +
|
||||
"H# #H" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 002 >>>======
|
||||
|
||||
"$0 @@ S$S 0 & $" +
|
||||
"H-----@-@----H----@@-------H" +
|
||||
"H----$@--@---H----@-@------H" +
|
||||
"H---@@@------H---$@--@-----H" +
|
||||
"H---@@@------H--@@@--------H" +
|
||||
"H------------H--@@@--------H" +
|
||||
"H0 $$$ 0 0H" +
|
||||
"H $ $$ H" +
|
||||
"H------------H---------@@--H" +
|
||||
"H--------@@--H---------@-@-H" +
|
||||
"H--------@-@-H--------$@--@H" +
|
||||
"H-------$@--@H-------@@@---H" +
|
||||
"H------@@@-----------@@@---H" +
|
||||
"H @@@ $$$ H" +
|
||||
"H H" +
|
||||
"H$$$$$$$$$$$$$$$$$$$$$$$$$$H",
|
||||
|
||||
//======<<< Level 003 >>>======
|
||||
|
||||
"HHHHH$HH0HHHHHHHH&HHH S" +
|
||||
"HHHHHHHHHHHHHHHHHHHHH@ S" +
|
||||
"HHHHHHHHHHHHHHHHHHHHH@ S" +
|
||||
"$HHHHH0HHHH$HHHHHHHHH@######" +
|
||||
"HHHH@@@@@@@@@@@@@@@@@@@@@@@@" +
|
||||
"HHHHHHHHHHHHHHHHHHHHHHHHHHHH" +
|
||||
"HHHHH$HHHHHHHH0HH$HHHHHHHHHH" +
|
||||
"@@@@@@@@@@@@@@@@@@@@@@@@HHHH" +
|
||||
"HHHHHHHH$HHHHHHHHHH$HHH@HHH$" +
|
||||
"HHHHHHHHHHHHHHHHHHHHHHH@HHHH" +
|
||||
"HHHHHHHHHHHHHHHHHHHHHHH@HHHH" +
|
||||
"HHHH$HHHHHHHHH$HHHHHHH$@$HHH" +
|
||||
"HHHH@@@@@@@@@@@@@@HHHHH@HHHH" +
|
||||
"HHHHHHHHHHHHHHHHH@HHHHHHHHHH" +
|
||||
"HHHHHHHHHHH0H$H$H@HHHHHHHHHH" +
|
||||
"@@@@@@@@@@@@@@@#@@H$HHHHHHH$",
|
||||
|
||||
//======<<< Level 004 >>>======
|
||||
|
||||
" H " +
|
||||
"-------------S--------------" +
|
||||
" $S$ H" +
|
||||
" $ H#H# 0$ H" +
|
||||
"H@@@@@@@@@@@@H@@@@@@@@@@@@@@" +
|
||||
"H S " +
|
||||
"H $S$ " +
|
||||
"H 0 $ ##H##H $ 0 " +
|
||||
"@@@@@@@@@@@@@H@@@@@@@@@@@@@H" +
|
||||
" S H" +
|
||||
" $S$ H" +
|
||||
" $ H###H### $ 0 H" +
|
||||
"H@@@@@@@@@@@@H@@@@@@@@@@@@@@" +
|
||||
"H S " +
|
||||
"H $S$ " +
|
||||
"H $& ####H####H $ 0 ",
|
||||
|
||||
//======<<< Level 005 >>>======
|
||||
|
||||
"########################### " +
|
||||
"###########################S" +
|
||||
"& $ # S" +
|
||||
"H@#@#@#@#@#@# # ###########H" +
|
||||
"H@#@#@#@#@#@#@# # ####### #H" +
|
||||
"H $ # ####### #H" +
|
||||
"H#@#@#@#@#@# # # #-###-# #H" +
|
||||
"H#@#@#@#@#@#@# # #-###-# #H" +
|
||||
"H $ # #-# #-# #H" +
|
||||
"H@#@#@#@#@# # # #-# #-# #H" +
|
||||
"H@#@#@#@#@#@# # #-# #-# #H" +
|
||||
"H $ # #-# #-# #H" +
|
||||
"H#@#@#@#@# # #$#$#$#$#$#H" +
|
||||
"H#@#@#@#@#@# #X#########H" +
|
||||
"H 0000H" +
|
||||
"H########### ############",
|
||||
|
||||
//======<<< Level 006 >>>======
|
||||
|
||||
"H--------------------------H" +
|
||||
"H# # # # $ ### # # H" +
|
||||
"H### ### # # # # ### H" +
|
||||
"H $ $ ### $ &H" +
|
||||
"H # # ### $ ### # #H" +
|
||||
"H ### # #$ ### # # ###H" +
|
||||
"H$ $ # # # # 0 H" +
|
||||
"H# # # # ### $ # # H" +
|
||||
"H### ### $ # # ### H" +
|
||||
"H $ $ # # ### $ H" +
|
||||
"H # # ### ### $ # # H" +
|
||||
"H ### # # # # ### H" +
|
||||
"H $ # # ### 0 H" +
|
||||
"H # # # # ###$ $ ### H" +
|
||||
"H ### ### # # # # H" +
|
||||
"H 000 $ ### $ $H",
|
||||
|
||||
//======<<< Level 007 >>>======
|
||||
|
||||
"HHHHHHHHHHHHHHHHHHHHHHHHHHHH" +
|
||||
"H H" +
|
||||
"H $$ H" +
|
||||
"H $XX$ H" +
|
||||
"H #XX# H" +
|
||||
"H $ $#XX#$ $ H" +
|
||||
"H #$# $ ##$# H" +
|
||||
"H $ $### #$ ###$ $ H" +
|
||||
"H #$### $##$ ###$# H" +
|
||||
"H #### #### #### H" +
|
||||
"H $ $## $ $# ##$ $ ##$ $ H" +
|
||||
"H #$## #$## ##$# ##$# H" +
|
||||
"H #X $ $### ###$ $ X# H" +
|
||||
"H ## #$### ###$# ## H" +
|
||||
"H ## ### $$$$$$ ### ## H" +
|
||||
"H & H######H 0000 H",
|
||||
|
||||
//======<<< Level 008 >>>======
|
||||
|
||||
"H$H##H$H@@H$H##H$H@@H$H##H$H" +
|
||||
"H@@H H##H H@@H H##H0H@@H H#H" +
|
||||
"HH0H@@H H##H0H@@H H##H H@@HH" +
|
||||
"HH##H H@@H H##H H@@H H##H HH" +
|
||||
"H@H H##H H@@H H##H H@@H H##H" +
|
||||
"H H@@H H##H H@@H H##H H@@H H" +
|
||||
"H##H H@@H H##H H@@H H##H0H@H" +
|
||||
"HH H##H H@@H H##H H@@H H##HH" +
|
||||
"HH@@H H##H H@@H H##H H@@H HH" +
|
||||
"H#H H@@H H##H H@@H H##H H@@H" +
|
||||
"H H##H H@@H H##H H@@H H##H H" +
|
||||
"H@@H H##H H@@H H##H H@@H H#H" +
|
||||
"HH H@@H H##H0H@@H H##H H@@HH" +
|
||||
"HH##H H@@H H##H H@@H H##H HH" +
|
||||
"H@H H##H H@@H H##H H@@H H##H" +
|
||||
"H&H@@H$H##H$H@@H$H##H H@@H$H",
|
||||
|
||||
//======<<< Level 009 >>>======
|
||||
|
||||
"############S # S##########S" +
|
||||
"## 0HHH HH 0S S0HH HH 0#S" +
|
||||
" $## $# $#HH H#$ ##$ ##$S" +
|
||||
"$## $# $#HH H##$ ##$ ##S" +
|
||||
"## $# $#HH $ & H ##$ ##$ ##" +
|
||||
"# $# $#HH $####H$ ##$ ##$ #" +
|
||||
" $ # $#HH $## ##H$ ##$ ##$ " +
|
||||
"H## $#HH $## $$ ##H$ ##$ ## " +
|
||||
"H# $#HH $##$H##H$##H$ ##$ ##" +
|
||||
"H $#HH $##$H# #H$##H$ ##$ " +
|
||||
"H$#HH $##$H# $$ #H$##H$ ##$0" +
|
||||
"H#HH $##$H# $##$ #H$##H$ ##H" +
|
||||
"HHH $##$H# $####$ #H$##H$ #H" +
|
||||
"HH $##$H# $##$$##$ #H$##H$ H" +
|
||||
"H$ ##$H# $ ## $ #H$##H$H" +
|
||||
"##H $#H ############ H# $H##",
|
||||
|
||||
//======<<< Level 010 >>>======
|
||||
|
||||
"H--- #### $HH ######## " +
|
||||
"H $##$### $H $## # " +
|
||||
"H $####$## $H $##$H####### " +
|
||||
"H$######$# H$ -##$H ## " +
|
||||
"H######### $H -# H ## " +
|
||||
"H --$$#$$# H$ -#H $# " +
|
||||
"H$ ##$##$ $H -#H# H# " +
|
||||
"&H $##$## H$ -#H#$H#$H#$H# " +
|
||||
" #H ##$##$ $H -#H@@@@@@@@@# " +
|
||||
"0#H $##$## H$ -#H # " +
|
||||
" #H ##$##$ $H -######H##### " +
|
||||
" #H $##$## #H -##$ #H# $# " +
|
||||
" $H ##$##$# H - # 0#H# ## " +
|
||||
" #H ##### H ## ###H#### " +
|
||||
" H--- ##### #HHHHH### " +
|
||||
" S ",
|
||||
|
||||
//======<<< Level 011 >>>======
|
||||
|
||||
"H--------------------------H" +
|
||||
"H & H" +
|
||||
"H ##### ##### ##### ##### H" +
|
||||
"H # $ # # $ # # $ # # $ # H" +
|
||||
"H #@### ##### ##### #@### H" +
|
||||
"H # # # # H" +
|
||||
"H ###@# ##### ##### ###@# H" +
|
||||
"H # $ # # $ # # $ # # $ # H" +
|
||||
"H #@### ##### ##### #@### H" +
|
||||
"H # # # # H" +
|
||||
"H ###@# ##### ##### ###@# H" +
|
||||
"H # $ # # $ # # $ # # $ # H" +
|
||||
"H ##### ##### ##### ##### H" +
|
||||
"H # # # # H" +
|
||||
"H0 # # 0H" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 012 >>>======
|
||||
|
||||
"S ------------------------H" +
|
||||
" #S X 0 # # 0 # # # H" +
|
||||
" $XS $#$ $X$ $#$ $X$ $#$ H" +
|
||||
"X #X#S### #X# ##X XX# ### H" +
|
||||
" # S # # # # # H" +
|
||||
"$#$ $XS SXS $#$ $X$ $X$ $#$H" +
|
||||
"X## ###S##XSX## #XX ### ###H" +
|
||||
" # # 0 # S # 0 X # # H" +
|
||||
" $X$ $#$ $XS $X$ $#$ $#$ H" +
|
||||
"X ### ### ###S### X## X#X H" +
|
||||
" # # # S # # # H" +
|
||||
"$#$ $#$ $X$ $#S $#$ $#$ $#$H" +
|
||||
"X## ### ### ###S##X ### ##XH" +
|
||||
" # $ # $ # $ # S # $ # $ # H" +
|
||||
"& H#H HXH H#H S# H#H H#H 0H" +
|
||||
"##H H H H H H H H H H H H##H",
|
||||
|
||||
//======<<< Level 013 >>>======
|
||||
|
||||
"@ @@@@@@@@@@@@@@@@@@@@@@@@@S" +
|
||||
"@S&H H$H H$H H$H H$H H$H H@S" +
|
||||
"@@@H@@@@@@@H@@@@@@@H@@@@@H@S" +
|
||||
"@H@H$H H$H@H$H H$H@H$H@H@H@S" +
|
||||
"@H@@@@@@@H@H@@@@@@@@@H@H@H@S" +
|
||||
"@H$H H$H@H@H@H$H H$H@H@H@H@S" +
|
||||
"@@@H@@@@@H@H@H@@@@@H@H@H@H@S" +
|
||||
"@H@H@H H$H@H@H@H$H@H@H H$H@S" +
|
||||
"@H@H@H@@@@@H@H@H@H@H@@@@@H@S" +
|
||||
"@H$H H$H@H$H@H$H@H@H H$H@H@S" +
|
||||
"@H@@@@@H@H@H@@@H@H@@@@@H@H@S" +
|
||||
"@H@H$H H@H@H$H@H@H H$H@H@H@S" +
|
||||
"@H@H@@@@@@@@@@@H@H@@@H@H@@@S" +
|
||||
"@H@H H$H H$H H$H@H@H@H@H0H@S" +
|
||||
"@H@@@@@@@@@@@@@@@H@H@H@@@H@S" +
|
||||
"@H0H$H H@H H$H H$H@H$H H@H ",
|
||||
|
||||
//======<<< Level 014 >>>======
|
||||
|
||||
" & 0 0 0 0 0 S" +
|
||||
"###H#X#H###H#X#H###H#X#H###H" +
|
||||
"###H#X#H###H#X#H###H#X#H###H" +
|
||||
"###H#X#H###H#X#H###H#X#H###H" +
|
||||
"HHHHHHHHHHHHHHHHHHHHHHHHHHHH" +
|
||||
"###H#X# #X#H### #X#H#X# ###H" +
|
||||
"###H#X# #X#H### #X#H#X# ###H" +
|
||||
"###H#X#$#X#H###$#X#H#X#$###H" +
|
||||
"HHHHHHHHHHHHHHHHHHHHHHHHHHHH" +
|
||||
"#X# ###H#X# ###H#X# ###H#X#H" +
|
||||
"#X# ###H#X# ###H#X# ###H#X#H" +
|
||||
"#X#$###H#X#$###H#X#$###H#X#H" +
|
||||
"H$HHH$HHH$HHH$HHH$HHH$HHH$HH" +
|
||||
"###H###H###H###H###H###H###H" +
|
||||
"###H###H###H###H###H###H###H" +
|
||||
"###H###H###H###H###H###H###H",
|
||||
|
||||
//======<<< Level 015 >>>======
|
||||
|
||||
"0 " +
|
||||
"&$ $ $ $ $ $ $ $ S " +
|
||||
" H- H- H- H- H- H- H- H- H- " +
|
||||
" H H H H0 H H H0 H H " +
|
||||
" H H H H H H H H H " +
|
||||
" H H H H H H H H H " +
|
||||
" H H H H H H H H -H " +
|
||||
" H H H H H H H -H " +
|
||||
" H H H H H H -H " +
|
||||
" H H H H H -H #####H" +
|
||||
" H H H H -H #$######H" +
|
||||
" H H H -H ###########H" +
|
||||
" H H -H ##############H" +
|
||||
" H -H # ###############H" +
|
||||
"-H ####################H" +
|
||||
" S #######################H",
|
||||
|
||||
//======<<< Level 016 >>>======
|
||||
|
||||
"HHHH HHHHHHHHHHHHHHHHHHHHHH" +
|
||||
"H $## @@ $ @H$0 @@$ @H $H" +
|
||||
"H $## @@0$ @H$ @@$ @HH" +
|
||||
"H$## $ @@ $ @H$ @@$ H" +
|
||||
"H## H## @@ $ @H$ @@$H" +
|
||||
"H@ $ HX# @@ $ @H$ @H" +
|
||||
"H @@ $ H#X @@ $ @H$ H" +
|
||||
"H$ @# ## $@@ $ @@H" +
|
||||
"H@H$ @@ $ H## @@ $ H" +
|
||||
"H$ @H$ @@ $ HX# @@&H" +
|
||||
"H@$ @H$0 @@ $ H#X $#H" +
|
||||
"H @@$0 @H$ @# ## $#@@H" +
|
||||
"H$ @@ $ @H$ @@ $ $#@ H" +
|
||||
"H@H$ @@$ @H$ @@ $ $#@ H" +
|
||||
"H0 @H @@ @H ## ## H" +
|
||||
"HHHHHHHHHHHHHHHHHHHH#######H",
|
||||
|
||||
//======<<< Level 017 >>>======
|
||||
|
||||
" S S " +
|
||||
" $ S S " +
|
||||
" H@#H0 S S H#@H $ " +
|
||||
"H@#H H@@H H@@H H@@H" +
|
||||
"H& $ $ H#@H $H#@H $ $ H" +
|
||||
"@@H $ $ SH@@H H@#" +
|
||||
" H#@H0 H@@S$ H@@H H@#H $" +
|
||||
"H@@$ H#@H $ HS@@H$ H@@" +
|
||||
"H $ H#@H0 H@#S H#@H " +
|
||||
"H#@S $ H@@S H $ H 0 " +
|
||||
" $ S@@H H@@ S#@H H@#@H " +
|
||||
" H@#H $ H@@H $ H " +
|
||||
" H@#H $H@@H H#@H H " +
|
||||
"H@@H H#@H H@#H H@#H$ H@@H " +
|
||||
"H S S 0S S$ S$S S S $S " +
|
||||
"H@@@@@@@@H# @@#@@H# @@@@@@@@",
|
||||
|
||||
//======<<< Level 018 >>>======
|
||||
|
||||
"########################### " +
|
||||
"& - #H ##H ##H ## ##H" +
|
||||
"##-###H###-#H###-#H###-# ##H" +
|
||||
"##-#X#H###-#H###-#H#$#-# ##H" +
|
||||
"##-#X#H##- #H###-#H#X- # ##H" +
|
||||
"##-#X#H - ##H -#H #####H" +
|
||||
"##-#X#H ####H#X#-#H#### # #H" +
|
||||
"##-#X#H# ###H###-#H#### # #H" +
|
||||
"##-#X#H##$##H###-#H####$ #H" +
|
||||
"##-#$ H#XX H#$#- H# $### #H" +
|
||||
"###X#########X##X###X######H" +
|
||||
" SSS -------------------0 0H" +
|
||||
"S SS S SS S SS S S 0 H" +
|
||||
" SS S S SS SS SS H" +
|
||||
" S S S S S S H" +
|
||||
"SSS SS S S S S H",
|
||||
|
||||
//======<<< Level 019 >>>======
|
||||
|
||||
" -- @ - @@@ - @@" +
|
||||
"#H@$#@@H #$#@ H# $#@ H-$ " +
|
||||
"#H ##$ @H @@ H#$ #@ H # " +
|
||||
"#@@@@# @H 0H@# @## H #@ " +
|
||||
"$ #@@@H#@@@#@@#@@ H #@@ " +
|
||||
"X H@ H# -- ----H ##$@ " +
|
||||
"X@H @@#@@#@ $ @# @X@ #@@ " +
|
||||
" @@H - @@#@@@# @@$@@ @@ " +
|
||||
" @@H @#$@ $#@@@X@@@ @ " +
|
||||
"-- @@H @# @@@ ---H @@$ " +
|
||||
"$ H @@H H H @@ " +
|
||||
" #H @H H#@H---- @H @@ " +
|
||||
" #H@## @H#@# H 0 #0@ H " +
|
||||
"@# $##@ H@$##@@#S #@# HXS " +
|
||||
"@@@### H#@@## $#S#$@ H@$@S$" +
|
||||
"@$ #H@H &#@@ @S@# H X S@",
|
||||
|
||||
//======<<< Level 020 >>>======
|
||||
|
||||
"S " +
|
||||
"S$ 0 ------------$$" +
|
||||
"H@------------ $$$$$$$$ $$@H" +
|
||||
"H@X#######X###X###X####X##@H" +
|
||||
"H@ $ 0 $ $ $ $ @H" +
|
||||
"H@ @@@@@@@@@@@ ###X####X##@H" +
|
||||
"H@ $$$0$$$$$ @ @ $$$$$$$$ @H" +
|
||||
"H@ ######### @ @ ######## @H" +
|
||||
"H@ $ 0 $ $ @ $ $ @H" +
|
||||
"H#H###########X##########H#H" +
|
||||
"H#H$ 0 $ $ $ $ $ H#H" +
|
||||
"H############# @@@@@@@@@@##H" +
|
||||
"H $ & $ $@ $ $ $ $ H" +
|
||||
"H############# ########## #H" +
|
||||
"H $ $ $ $@ $ $ $ $ H" +
|
||||
"H############# ############H",
|
||||
|
||||
//======<<< Level 021 >>>======
|
||||
|
||||
"###########################S" +
|
||||
"####--------#--------- #S" +
|
||||
"### & # 0 H# #S" +
|
||||
"### #### ######### H# #S" +
|
||||
"## ##### ###$##$## H# #S" +
|
||||
"## $## #$#####$# H# #S" +
|
||||
"# 0 ###$####$ H# #S" +
|
||||
"# #### #$####$## H# #S" +
|
||||
"#X######@@ ###$#$### H# #S" +
|
||||
"#X#$$$$$#HH #$#####$# H# #S" +
|
||||
"#X######HH ####$####$ H# #S" +
|
||||
"#X#### ###$####$## HX #S" +
|
||||
"#X####H# ############ H####S" +
|
||||
"# H # ### H# #S" +
|
||||
"# H ### # H# $#S" +
|
||||
"########### #############XSS",
|
||||
|
||||
//======<<< Level 022 >>>======
|
||||
|
||||
"@@ @@@@@@@@@@S@@@@@@@@@@@ @@" +
|
||||
"#H$$$$$$$$$$$S&$$$$$$0$$$$H#" +
|
||||
"@H@@@@@@@@@@@H@@@@@@@@@@@@H@" +
|
||||
"#H@0$$$$$$$H H H$$$$$$$$ @H#" +
|
||||
"@H#$@@@@#@@H$H$H@@#@@@@@$#H@" +
|
||||
"#H@$#H$$$0@HHHHH@ $0$$ #$@H#" +
|
||||
"@H#$@H@@@X@@HHH@@X@@@@H@$#H@" +
|
||||
"#H@$#H@ $$$$HHH$$$ $H@H#$@H#" +
|
||||
"@H#$@H#$@@@@HHH@@@$@H#H@$#H@" +
|
||||
"#H@$#H@$$ $$HHH$$0$$H@H#$@H#" +
|
||||
"@H#$@H@@@X@@HHH@@X@@@@H@$#H@" +
|
||||
"#H@$#H$$$$#HHHHH#$$$$$H#$@H#" +
|
||||
"@H#$@@@@@@@H@$@H@@@@@@@@$#H@" +
|
||||
"#H@$$$$$$$$H#$#H$$$$$$$$$@H#" +
|
||||
"@H@@@@@@@@@@@$@@@@@@@@@@@@H@" +
|
||||
"#H$$$$$$$$$$$$$$$$$$$$$$$$H#",
|
||||
|
||||
//======<<< Level 023 >>>======
|
||||
|
||||
"########################### " +
|
||||
"#& # # # # -- -- --H" +
|
||||
"#$ # $H# $ # # $# #$ H" +
|
||||
"####H############### ##H###H" +
|
||||
"# #H$# # $# # $ #$H# H" +
|
||||
"# #H # # H#----H# H" +
|
||||
"#####H#####################H" +
|
||||
"# # H# # # $# $ #$H# H" +
|
||||
"# $ H#$ # #H HH#$ H" +
|
||||
"# #########################H" +
|
||||
"# # # #$H# # H# # H" +
|
||||
"# $ # # # $H# # # H" +
|
||||
"# ##H########H#############H" +
|
||||
"# $#H # # H$# #$ # H" +
|
||||
"# #H $ #H S# $H" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 024 >>>======
|
||||
|
||||
"H---------------- 0#### ----" +
|
||||
"H----- 0 ------- ####### ---" +
|
||||
"H--- ### ---- ######## ---" +
|
||||
"H-- ####### - ####### ----" +
|
||||
"H- # ####### ###### -----" +
|
||||
"H- # $ ############ ##### --" +
|
||||
"H-- ### ########## ######## " +
|
||||
"H------- ########## ########" +
|
||||
"H ############ #######" +
|
||||
"H ###$###$###### ######" +
|
||||
"H ############## ######" +
|
||||
"H -----########-----######" +
|
||||
"H ----## ###------#####" +
|
||||
"H-- ###S####H##### #### ####" +
|
||||
"H #$##S ###### ###### ###" +
|
||||
"H&HXH###S ##H#H## ###",
|
||||
|
||||
//======<<< Level 025 >>>======
|
||||
|
||||
"##########HHHHHHHH##########" +
|
||||
"#######HHHH00 &HHHH#######" +
|
||||
"######HH ###### HH######" +
|
||||
"#####HH #####-###### HH#####" +
|
||||
"####HH ######--# #$## HH####" +
|
||||
"###HH ##$####--####### HH###" +
|
||||
"###H ####0 -- 0#### H###" +
|
||||
"###H ########--######## H###" +
|
||||
"###H #####--#--#--##### H###" +
|
||||
"###H ####--##--##--#### H###" +
|
||||
"###HH ##- ## --###$-## HH###" +
|
||||
"####HH ###### -###### HH####" +
|
||||
"#####HH ###### ##### HH#####" +
|
||||
"######HH ###### HH######" +
|
||||
"#######HHHH HHHH#######" +
|
||||
"##########HHHHHHHH##########",
|
||||
|
||||
//======<<< Level 026 >>>======
|
||||
|
||||
"#####HHHHHHHHHHHHHHHHH######" +
|
||||
"####HH HH#####" +
|
||||
"###HH & 0 HH####" +
|
||||
"##HH H######H######H HH###" +
|
||||
"##H H# $ #H# $ #H H###" +
|
||||
"##H---H@$ #H# $@H---H###" +
|
||||
"##H$$$H## ###H### ##H$$$H###" +
|
||||
"##H$$$H # X@@@@@# # H$$$H###" +
|
||||
"##H H ### ### H H###" +
|
||||
"##H---H $$$ H---H###" +
|
||||
"##H H ########### H H###" +
|
||||
"##H0 $HHHHH$ 0H####" +
|
||||
"###H XX#XXXXX#XX H#####" +
|
||||
"####H0 0H######" +
|
||||
"#####H H#######" +
|
||||
"######H$$$$$$$$$$$$H########",
|
||||
|
||||
//======<<< Level 027 >>>======
|
||||
|
||||
" @0 @ " +
|
||||
" @H@@@@@@@@ @ " +
|
||||
" @H@@ @ " +
|
||||
" @H@@ @@@@@@@ " +
|
||||
" H H " +
|
||||
" H H " +
|
||||
" H H " +
|
||||
" H H @@@@@@@@@@@@@@@@@@@S" +
|
||||
" H $$@$$$$$$$$$$$$$$$$$$H" +
|
||||
" H @@@@@@@@@@@@@@@@@@@@@@" +
|
||||
" H " +
|
||||
" H $$$$$$$$$$$$$$$$$$$$$H" +
|
||||
" H @@@@@@@@@@@@@@@@@@@@@@" +
|
||||
" H " +
|
||||
" H $$$$$$$$$$$$$$$$$$$$$H" +
|
||||
"& H @@@@@@@@@@@@@@@@@@@@@@",
|
||||
|
||||
//======<<< Level 028 >>>======
|
||||
|
||||
" & 0 " +
|
||||
"##S#####X#########S#########" +
|
||||
" S # #S " +
|
||||
"S##########X##########X###S#" +
|
||||
"S # # S " +
|
||||
"####S###############X### S " +
|
||||
" S------------ S " +
|
||||
" - H ### ####H" +
|
||||
"####--H########### ---H" +
|
||||
"####- H - H" +
|
||||
"##0#- #####H####### - H" +
|
||||
"####- H $ - H#" +
|
||||
"##0#- ##H###### H##H # - H##" +
|
||||
"####- H H H H###" +
|
||||
"#$$# H H H H###" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 029 >>>======
|
||||
|
||||
"HHH#H H#& 0#0HHHH" +
|
||||
"X#X#H $ $ $ $ H###$##X##H" +
|
||||
"H#X#H HHHHHHHH $HHH#$0$$0#H" +
|
||||
"H#HHH H#X#XXXH $ H#####$##" +
|
||||
"H##HH H#SS$$XHHHHH HHHHH#$$0" +
|
||||
"X##H$ H#$SS#X#XX#H $ $ H#X##" +
|
||||
"HHHHH H#SS$#XS$$#HHHHH HHHHH" +
|
||||
"H###H H###X#XSS##X#X#H $$$S" +
|
||||
"H$$#H HHHHH#$$$##$SS#H $HHHH" +
|
||||
"HHH#H$ H#X####SS$#H $HXX" +
|
||||
"HXH#H HHHHH#$$$$#H $HXH" +
|
||||
"HXH#####H$ H####X#H HHHXH" +
|
||||
"HXHHHHH#H HHHHHHHH H#XXH" +
|
||||
"HX##X#H#X###H$ $ $ $H#HHH" +
|
||||
"HHHH$#HHHH###HHHH HHHH#H#X" +
|
||||
"XXXXH###$HHH#XXXH$ $HXXX#H#H",
|
||||
|
||||
//======<<< Level 030 >>>======
|
||||
|
||||
"##############S#############" +
|
||||
"# 0 $ 0 &SSS 0 $ 0 #" +
|
||||
"#S########### ##########S#" +
|
||||
" H------------------------H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S H " +
|
||||
" H S$ H " +
|
||||
" H $ @ $ H " +
|
||||
" H @ @ @ H " +
|
||||
"H @ @ @ 0 H" +
|
||||
"H##### #### @ #### ####H",
|
||||
|
||||
//======<<< Level 031 >>>======
|
||||
|
||||
" SS---S---S---S---S---S---SS" +
|
||||
" H##X###X###X###X###X###X##H" +
|
||||
" H#---# #-- # --# #---#H" +
|
||||
" H#X#X#X#X#X#X#X#####X#X#X#H" +
|
||||
" H# #---# # X---# #H" +
|
||||
" H##X#X#X#X#X#X#X###X#X#X##H" +
|
||||
" H# # #---#---# # #H" +
|
||||
" H#X#X#X###X#X#X#X#X#X#X#X#H" +
|
||||
" H# X H#---#---# # #H" +
|
||||
" H##XXX#X#X#X#X#X#####X#X##H" +
|
||||
" H# #---# X #H--# #H" +
|
||||
" H#X#X#X#X#X#XX######X#X#X#H" +
|
||||
" H#--- # # #H # #--#H" +
|
||||
" H##X#X#X#X#XXXXX#X#X#X#X##H" +
|
||||
" H&00 $ 000H" +
|
||||
" ############S S############",
|
||||
|
||||
//======<<< Level 032 >>>======
|
||||
|
||||
" S & S " +
|
||||
" H H##########@@@@@@@@@@@ H " +
|
||||
" H H# H H " +
|
||||
" H H@$#H# $ 0 $H#H H " +
|
||||
" H H@@@@@@@@@@@@@@@@@@##H H " +
|
||||
" H H# ---H H " +
|
||||
" H H#$ 0 0 0 $#H# $#H H " +
|
||||
" H H#######@@@@@@@@@@#H H " +
|
||||
" H---H--- # H " +
|
||||
" H H#$ #H# $$ @H H " +
|
||||
" H H######@@@@@@@@@@H H " +
|
||||
" H H@ H " +
|
||||
" H H@$0 #H#H $$ #H H " +
|
||||
" H H@#@@@@@@@@@@@#H H " +
|
||||
" H H " +
|
||||
" H H ",
|
||||
|
||||
//======<<< Level 033 >>>======
|
||||
|
||||
"-------------H$-------------" +
|
||||
" $ $0$ $H $&$ $ " +
|
||||
"######## H$ ########" +
|
||||
"## ## $H ## ##" +
|
||||
"#S# # # H$ # # #S#" +
|
||||
"#SS# # # $H # # #SS#" +
|
||||
"#SSS#0 # # H$ # # 0#SSS#" +
|
||||
"#SSSSXX###X##$H##X###XXSSSS#" +
|
||||
"#SSSSX # #H$# # XSSSS#" +
|
||||
"#####X##$ #$H# $##X#####" +
|
||||
" #HHHXHH#$ #H$# $#HHXHHH# " +
|
||||
" #HHXHHH#$ #$H# $#HHHXHH# " +
|
||||
"H #HXHHHHX$#H$#$XHHHHXH# H" +
|
||||
"HH #XHHHHHX#$H#XHHHHHX# HH" +
|
||||
" H XX####X#H$#X####XX H " +
|
||||
"##HH $H HH##",
|
||||
|
||||
//======<<< Level 034 >>>======
|
||||
|
||||
" S - 0 " +
|
||||
"@S H #H @--------X" +
|
||||
" H@H#@@@@##@H###@H H H" +
|
||||
"H@@@H - @ $ @H##@H @ @ H" +
|
||||
"H@$ H$ $@H0-HH#@H--$ $-@H" +
|
||||
"H@@H H H@@H @@H@H @ $-@ H" +
|
||||
"H$@H H @$ H $@H@H--$ @ $-@H" +
|
||||
"H@$H-H@@H H $H@H@H @-$ @ H" +
|
||||
"H$@H @$ H H XH H@H--$ @ $-@H" +
|
||||
"H@$H@@H H H @$@H@H @ $-@ H" +
|
||||
"H@@@$ H H H $X$H@H--$ @ $-@H" +
|
||||
"H$@@H H H H H@@@ H @-$ @ H" +
|
||||
"@@$ H H H H H@ #H--$ @ $-@H" +
|
||||
"@ H H H H H H #H@H @ @ H" +
|
||||
"$@H@H@H@H@H @@@ &H@S 00 H" +
|
||||
"H H H H H H #H@@@####@@#@",
|
||||
|
||||
//======<<< Level 035 >>>======
|
||||
|
||||
"S S" +
|
||||
"S $ 0 $ $ $ 0 $S" +
|
||||
"@@@@@@@@@@#H H#@@@@@@@@@@@@" +
|
||||
" H H " +
|
||||
" H##H " +
|
||||
"$ 0$ $ H H $ 0 $ " +
|
||||
"#@#@#@#@#@#@HH@#@#@#@#@#@#@#" +
|
||||
" HH " +
|
||||
"------ $ HH $ --------" +
|
||||
" H@@@@@@@@@@@@H " +
|
||||
" H H " +
|
||||
" $ 0 H $ $ H $0 $ " +
|
||||
"@@@@X#######HH#######X@@@@@@" +
|
||||
" HH " +
|
||||
" HH " +
|
||||
" $ &$ HH $ $ ",
|
||||
|
||||
//======<<< Level 036 >>>======
|
||||
|
||||
" SSSSSSSSSSSSSSSSSSSSSSSSS " +
|
||||
" S 0 ----- & S " +
|
||||
" S######### H #########S " +
|
||||
" SSH-H-H-H #HHH# H-H-H-HSS " +
|
||||
" #-H-H-H-H-#H H#-H-H-H-H-# " +
|
||||
" #-H$H H$H-#HHH#-H$H H$H-# " +
|
||||
" ######### HHH ######### " +
|
||||
" H H " +
|
||||
" HHH ### " +
|
||||
" HHH #--H $ " +
|
||||
"H# -----$ H H # $ H### " +
|
||||
"H@$ --- # HHH-- @ # H-- " +
|
||||
"H#@#$- #H#@#@#H# # H " +
|
||||
"H #@#@#H 0 H #@#@#@#@# $@" +
|
||||
"@H @# #@#H#H $ $ #@" +
|
||||
"#@#@H$#H $ H#@#@#@#@#@#",
|
||||
|
||||
//======<<< Level 037 >>>======
|
||||
|
||||
" S " +
|
||||
" H------------------HS " +
|
||||
" H- - - - - - - -###H " +
|
||||
" H # # # # # # # # H " +
|
||||
" H############### ### H " +
|
||||
" H# #### # ### # X#### H " +
|
||||
" H###############X####H " +
|
||||
" 0 H### ##### #####X#### H " +
|
||||
"H########## #### $ X#### H " +
|
||||
"H##-############X##X#### H" +
|
||||
"H#### $### ####X##X#### H " +
|
||||
"H# H##### ###-X#-X#-## H " +
|
||||
"HX###HX####$ ##X##XX####H " +
|
||||
"HX#-###--####--X##X--### H " +
|
||||
"HX####----##----##----## H " +
|
||||
"H HH 0 HH $ HH $ HH & H",
|
||||
|
||||
//======<<< Level 038 >>>======
|
||||
|
||||
"&HHHH#### H###H-----####HHHH" +
|
||||
"H###H-----H###H#### ####H##H" +
|
||||
"H### ##X#0H###H####-----H##H" +
|
||||
"H $0$0 $0$H $ H$ $ $$ $ H" +
|
||||
"### @@X# #HX#H##H# X#X# #XH#" +
|
||||
"### $X# #HX#H##H# $#X# ##H#" +
|
||||
"#X# ##X# #HHHH##H# X#X# H HH" +
|
||||
"$$ $--------- $H $ $ $ $ " +
|
||||
"## XH##0#X## #X#H #X#H ##XX " +
|
||||
"## XH## #X#$-HHHH #$#H------" +
|
||||
"## XH## #X## ###H #X#H #### " +
|
||||
"$ $ H $ $ $$ H $$ H $$ $" +
|
||||
"#HXH#XHX### ####HX##XH#### #" +
|
||||
"#HXH##HX### ####HX##XH#### #" +
|
||||
"#HHHHHHX### ####HX##XH#### #" +
|
||||
"$H$$$$$$$$$$$$$$H$$$$H$$$$$$",
|
||||
|
||||
//======<<< Level 039 >>>======
|
||||
|
||||
" 0 -- & " +
|
||||
" H####### ######H " +
|
||||
" H####### ######H-H- SS " +
|
||||
" H ### ### 0 H S S" +
|
||||
"H--H ### ### H S S" +
|
||||
"H H ### ### H SS " +
|
||||
"H 0 ### ### H " +
|
||||
"H ### $$ $$ ### H S S " +
|
||||
"H ### ## ## ### H SS " +
|
||||
"H ### ### H S SS" +
|
||||
"H ### ##### ### H " +
|
||||
"H ### ##### ### H#@##H" +
|
||||
"H ## ### ### # $ #H" +
|
||||
"#####H### $#$ ###---# # #H" +
|
||||
"# $ #H ###########----## ##H" +
|
||||
"# # #H ## ## H",
|
||||
|
||||
//======<<< Level 040 >>>======
|
||||
|
||||
" " +
|
||||
"H---- " +
|
||||
"H &0 H###H --------- H###H" +
|
||||
"H #H#####H ----- H#####H" +
|
||||
"H ##H#H###H## ##H###H#H" +
|
||||
"H ##H#H###H## ### ##H###H#H" +
|
||||
"H #H###H#### H ####H###H" +
|
||||
"H H###H#### #H# ####H###H" +
|
||||
"H #H#H###H## #H# ##H###H#H" +
|
||||
"H ##H#H###H## #H# ##H###H#H" +
|
||||
"H ##H###H#### #H# ####H###H" +
|
||||
"H #H###H#### #H# ####H###H" +
|
||||
"H H H###H## #H# ##H###H#H" +
|
||||
"#H H##H###H #H# H###H#H" +
|
||||
"##HH##### $ ##H## $ ###H" +
|
||||
"######################### H",
|
||||
|
||||
//======<<< Level 041 >>>======
|
||||
|
||||
" 0 S #S" +
|
||||
"## H### S # #S######S" +
|
||||
" ##H #S###### ### #S" +
|
||||
" H # ##### # H# #S" +
|
||||
" #S###### ####### #S" +
|
||||
" ### ####### 0 ##S" +
|
||||
" # ####### S" +
|
||||
"#### ## & ####H # S" +
|
||||
" H#### H H###S" +
|
||||
" H## H $ ####H H#### $ S" +
|
||||
"#H ### H### $ H#XS" +
|
||||
" H $ H $ H### H " +
|
||||
" ######H## ##### H ####H " +
|
||||
" $ 0 H $ H H " +
|
||||
"### ######H ### ####H H###" +
|
||||
" H H H ",
|
||||
|
||||
//======<<< Level 042 >>>======
|
||||
|
||||
" ---- SS0 " +
|
||||
" H #######S S###### " +
|
||||
" H##### # #S S# # " +
|
||||
" H# ##### #&SS # H#####" +
|
||||
"H#H### # #H ###H## H# # #" +
|
||||
"H# # # #H # H H### #" +
|
||||
"H# $# # #H#######H H# #" +
|
||||
"H# ##### #H ###H# #####" +
|
||||
"H# # # # ### #H## H####H " +
|
||||
"H##### ### H##### H# #H " +
|
||||
"H # #$H # #######H #H$ " +
|
||||
"H # ###### # # 0 # $H#### " +
|
||||
"#H###H# 0# # # # # H# 0# " +
|
||||
"#H #H# $##### # ##### # " +
|
||||
"#H #H###### ##### #X## " +
|
||||
"#####H # X ",
|
||||
|
||||
//======<<< Level 043 >>>======
|
||||
|
||||
" ###H### ###H### " +
|
||||
" ### H #### H ### " +
|
||||
" # H###### ######H # " +
|
||||
" ##S#### ####S## " +
|
||||
" #S H### ###H S# " +
|
||||
"X #S#####H H#####S# X" +
|
||||
"X@@S@@@@@@@@H H@@@@@@@@S@@X" +
|
||||
"X S $ # H H # $ S X" +
|
||||
"X@@S@@@@@@H@ -- @H@@@@@@S@@X" +
|
||||
" S H # # H S " +
|
||||
"0# S #H & H## ##H 0 H# S #0" +
|
||||
" #####H####H# #H####H##### " +
|
||||
"0 #H##$ H#$$#H $##H# 0" +
|
||||
"## ##H #--H#$$#H--# H## ##" +
|
||||
"### H ########## H ###" +
|
||||
"########H H########",
|
||||
|
||||
//======<<< Level 044 >>>======
|
||||
|
||||
" & S" +
|
||||
" ##H#H#######H#########H###S" +
|
||||
" H #H# H #H# H # S" +
|
||||
" ##H##H## #H####H##S#######S" +
|
||||
" H S H H H H H S" +
|
||||
" #H H# ##H #H# #H # H- " +
|
||||
" # H H - #H ### #H###H " +
|
||||
" #H# #H##$#H#H # H #H " +
|
||||
" H# #H#-H# H-#H# H #H#H " +
|
||||
" H H####0## H #### H#H " +
|
||||
" #H - #H#- # #H - H#H " +
|
||||
" #H # H#### H# H H#$## H#H " +
|
||||
" H H#H---## #H HH#---H#H " +
|
||||
" ##H H H #H# # H#####HH " +
|
||||
" ###H- H----H---##-----H " +
|
||||
" 0 ",
|
||||
|
||||
//======<<< Level 045 >>>======
|
||||
|
||||
"############# " +
|
||||
"#& # # $ # H ----------" +
|
||||
"# #$ H# $#-H H " +
|
||||
"#####H#######0H SH ####### " +
|
||||
"# #$H# #$ # H S H $###$## " +
|
||||
"#$ # H#$ #-HS H #$####$ " +
|
||||
"## ##H####### H $###$## " +
|
||||
"# $# H# $#H # H #$####$ " +
|
||||
"# $H# #$ # H $###$## " +
|
||||
"#####H####### H #$####$ " +
|
||||
"#--# H#--# # H " +
|
||||
"#--# H#--# 0# H#########" +
|
||||
"############# H# H# $#" +
|
||||
"#H # # H#########" +
|
||||
"#H0 # $ H# H# #H $#" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 046 >>>======
|
||||
|
||||
" 0S S0 " +
|
||||
"@@ @@ @S & S@@ @ @@@@@ " +
|
||||
"@ @ @ @ S H S @ @ @ @@@ " +
|
||||
"@ @ @ SHS @ @@ @@@@@ " +
|
||||
"#####X###@#H########## 0## " +
|
||||
"H- H - - $-$$#H###H" +
|
||||
"H $#####$#H#$H# H# H##H #H" +
|
||||
"H $$#####$#H#@@@XX#H#X#$###H" +
|
||||
"H$$$#####$#H $ @@ $ $ H" +
|
||||
"H#$######$#HX@@#X######@@##H" +
|
||||
"H @@X$X@@@H@ $XX# $#@ $@@@H" +
|
||||
"##H@@$$$@@@H#H###@#########H" +
|
||||
"# H@$$$$$@@H@$ $ $#H" +
|
||||
"#H#########H@@@@@@ #####@@#H" +
|
||||
"#H $ $ $ $ H #####H#$ $H" +
|
||||
"############@ ####H0#H#S####",
|
||||
|
||||
//======<<< Level 047 >>>======
|
||||
|
||||
"H - 0 0 0 0 - - - &-H" +
|
||||
"H# ##$##$##$##$## ## ## ## H" +
|
||||
"H## ## ## ## ## ## ## ## ##H" +
|
||||
"H ## ## ## ## ## ## ## ## #H" +
|
||||
"H# ## ## ## ## ## ## ## ## H" +
|
||||
"H## ## ## ## ## ## ## ## ##H" +
|
||||
"H ## ## ## ## ## ## ## ## #H" +
|
||||
"H# ## ## ## ## ## ## ## ## H" +
|
||||
"H## ## ## ## ## ## ## ## ##H" +
|
||||
"H ## ## ## ## ## ## ## ## #H" +
|
||||
"H# ## ## ## ## ## ## ## ## H" +
|
||||
"H## ## ## ## ## ## ## ## ##H" +
|
||||
"H ##$##$##$##$##$##$##$##$#H" +
|
||||
"H# ## ## ## ## ## ## ## ## H" +
|
||||
"H H" +
|
||||
"############################",
|
||||
|
||||
//======<<< Level 048 >>>======
|
||||
|
||||
" S S " +
|
||||
" S S " +
|
||||
" # S S # " +
|
||||
" #@@X#H#X@@@@X#H#X@@# " +
|
||||
" #$$X#H#X X#H#X$$# " +
|
||||
" ### @H# #### #H@ ### " +
|
||||
" @@H@@ @@H@@ " +
|
||||
" #@@X@HH@ @HH@X@@# " +
|
||||
" #$$X@H##@X@@X@##H@X$$# " +
|
||||
" ### @H#$$X@@X$$#H@ ### " +
|
||||
" @@H### @@ ###H@@ " +
|
||||
" #@@X@HH @@@@ HH@X@@# " +
|
||||
" #$$X@H H@X$$# " +
|
||||
" ### @H H@ ### " +
|
||||
" 00 @HH & 00HH@ 0 " +
|
||||
"####H H##############H H####",
|
||||
|
||||
//======<<< Level 049 >>>======
|
||||
|
||||
"##S S###" +
|
||||
"#####S0 & 0S######" +
|
||||
"#########SH#####HS##########" +
|
||||
" $ HX XH $ " +
|
||||
" H## H##$##H ##H " +
|
||||
"H#### H# H#####H #H #####H" +
|
||||
"H H##S#######S##H H" +
|
||||
"H 0 HX #S# X$ #SX #H 0 H" +
|
||||
"H######$#S#$### #S#$#######H" +
|
||||
"H #X#S#####X#S#X# H" +
|
||||
"X#H S S H###" +
|
||||
"X####H# S#########S #H###XX#" +
|
||||
"X$ #H##SH# $#$ #HS##H # $#" +
|
||||
"##$ H ##H# X#X #H## H # ##" +
|
||||
"### H H#######H H# " +
|
||||
"#####H###H H###H######",
|
||||
|
||||
//======<<< Level 050 >>>======
|
||||
|
||||
"& -- -- ---- # $0$ $" +
|
||||
"0#H H@ $ @H#$#$# #H#X# H" +
|
||||
"@#####@H# ##H# # ####HH## H" +
|
||||
"@#####@H # #H#-- #$##H ##- H" +
|
||||
" H H########H $ H" +
|
||||
"H######XH H--# #$## ## ##" +
|
||||
"H# #H #H# $# H#$ ###@@ ###" +
|
||||
"H#$ # $#H## # H###$H $" +
|
||||
"H ##### H # H#$##H- $ #H##" +
|
||||
"H# H# #H #0#H###$H ## $H#$" +
|
||||
"H#$ # $XH ##H#$# H#$H# # " +
|
||||
"H ##### H #H# 0#H#HH####" +
|
||||
"H# # #H -H $ #HH ## $" +
|
||||
" #$ # $#H H $ # #H H##" +
|
||||
"$#######H H # #@HH H## H#$" +
|
||||
" H# # #@ H H##$H# ",
|
||||
|
||||
//======<<< Level 051 >>>======
|
||||
|
||||
"& #0000# $ $ " +
|
||||
"# #----#H##########S##### " +
|
||||
" # #H# - S - - " +
|
||||
" $ #H#H###S####$## ## ##" +
|
||||
"### #H#H#$#S#####$## ## #" +
|
||||
"HH #H#H# #S ##$## ## " +
|
||||
"HH HH#H###S ##$## ##" +
|
||||
"HH H# S ##$## #" +
|
||||
"### ###H# S ##$## " +
|
||||
"@@@@@@@@@@##S#######H ##$##" +
|
||||
" S#$H# H ## #" +
|
||||
"$ #HS# # H " +
|
||||
"#########H####@@########H##H" +
|
||||
" H # # H" +
|
||||
"$ H HXH $#####$ H" +
|
||||
"#########################XH#"
|
||||
|
||||
];
|
||||
@@ -0,0 +1,158 @@
|
||||
var VERSION = "0.99k";
|
||||
var AI_VERSION = 1;
|
||||
|
||||
var NO_OF_TILES_X = 28,
|
||||
NO_OF_TILES_Y = 16;
|
||||
|
||||
var BASE_TILE_X = 40,
|
||||
BASE_TILE_Y = 44;
|
||||
|
||||
var GROUND_TILE_X = 40,
|
||||
GROUND_TILE_Y = 20,
|
||||
TEXT_TILE_X = 40,
|
||||
TEXT_TILE_Y = 44;
|
||||
|
||||
var BASE_SCREEN_X = (NO_OF_TILES_X * BASE_TILE_X);
|
||||
var BASE_SCREEN_Y = (NO_OF_TILES_Y * BASE_TILE_Y + GROUND_TILE_Y + TEXT_TILE_Y);
|
||||
|
||||
var MIN_SCALE = 0.5,
|
||||
MAX_SCALE = 2;
|
||||
|
||||
var KEYCODE_BKSPACE = 8, //backspace
|
||||
KEYCODE_ENTER = 13,
|
||||
KEYCODE_SPACE = 32,
|
||||
KEYCODE_ESC = 27, //escape
|
||||
|
||||
KEYCODE_Z = 90, //dig left
|
||||
KEYCODE_X = 88, //dig right
|
||||
|
||||
KEYCODE_LEFT = 37, //move left
|
||||
KEYCODE_RIGHT = 39, //move right
|
||||
KEYCODE_UP = 38, //move up
|
||||
KEYCODE_DOWN = 40, //move down
|
||||
|
||||
KEYCODE_DASH = 189, //'-'
|
||||
KEYCODE_DOT = 190, //'.'
|
||||
|
||||
KEYCODE_U = 85, //dig left
|
||||
KEYCODE_O = 79, //dig right
|
||||
|
||||
KEYCODE_J = 74, //move left
|
||||
KEYCODE_L = 76, //move right
|
||||
KEYCODE_I = 73, //move up
|
||||
KEYCODE_K = 75, //move down
|
||||
|
||||
KEYCODE_PERIOD = 190, //'.'
|
||||
KEYCODE_COMMA = 188, //','
|
||||
|
||||
KEYCODE_A = 65, //'A'
|
||||
KEYCODE_C = 67, //'C'
|
||||
KEYCODE_R = 82, //'R'
|
||||
KEYCODE_S = 83, //'S'
|
||||
KEYCODE_T = 84, //'T'
|
||||
KEYCODE_V = 86; //'V'
|
||||
|
||||
var KEYCODE_0 = 48,
|
||||
KEYCODE_1 = 49,
|
||||
KEYCODE_2 = 50,
|
||||
KEYCODE_3 = 51,
|
||||
KEYCODE_4 = 52,
|
||||
KEYCODE_5 = 53,
|
||||
KEYCODE_6 = 54,
|
||||
KEYCODE_7 = 55,
|
||||
KEYCODE_8 = 56,
|
||||
KEYCODE_9 = 57;
|
||||
|
||||
var SCORE_COMPLETE_LEVEL = 1500, SCORE_COUNTER = 15;
|
||||
SCORE_GET_GOLD = 250,
|
||||
SCORE_IN_HOLE = 75,
|
||||
SCORE_GUARD_DEAD = 75;
|
||||
|
||||
var SCORE_VALUE_PER_POINT = 100; //for modern & edit mode
|
||||
|
||||
var PLAY_NONE = 0, PLAY_CLASSIC = 1, PLAY_MODERN = 2, PLAY_DEMO = 3, PLAY_EDIT = 4, PLAY_TEST = 5, PLAY_AUTO = 6;
|
||||
|
||||
|
||||
var GAME_START = 0, GAME_RUNNING = 1,
|
||||
GAME_FINISH = 2, GAME_FINISH_SCORE_COUNT= 3,
|
||||
GAME_WAITING = 4, GAME_PAUSE = 5,
|
||||
GAME_NEW_LEVEL = 6, GAME_RUNNER_DEAD = 7,
|
||||
GAME_OVER_ANIMATION = 8, GAME_OVER = 9,
|
||||
GAME_NEXT_LEVEL = 10, GAME_PREV_LEVEL = 11;
|
||||
|
||||
var ACT_UNKNOWN = -1, ACT_STOP = 0,
|
||||
ACT_LEFT = 1, ACT_RIGHT = 2,
|
||||
ACT_UP = 3, ACT_DOWN = 4,
|
||||
ACT_FALL = 5, ACT_FALL_BAR = 6,
|
||||
ACT_DIG_LEFT = 7, ACT_DIG_RIGHT = 8,
|
||||
ACT_DIGGING = 9,
|
||||
ACT_IN_HOLE = 10, ACT_CLIMB_OUT = 11,
|
||||
ACT_REBORN = 12;
|
||||
|
||||
//value | Character | Type
|
||||
//------+-----------+-----------
|
||||
// 0x0 | <space> | Empty space
|
||||
// 0x1 | # | Normal Brick
|
||||
// 0x2 | @ | Solid Brick
|
||||
// 0x3 | H | Ladder
|
||||
// 0x4 | - | Hand-to-hand bar (Line of rope)
|
||||
// 0x5 | X | False brick
|
||||
// 0x6 | S | Ladder appears at end of level
|
||||
// 0x7 | $ | Gold chest
|
||||
// 0x8 | 0 | Guard
|
||||
// 0x9 | & | Player
|
||||
|
||||
var EMPTY_T = 0x00;
|
||||
var BLOCK_T = 0x01;
|
||||
var SOLID_T = 0x02;
|
||||
var LADDR_T = 0x03;
|
||||
var BAR_T = 0x04;
|
||||
var TRAP_T = 0x05;
|
||||
var HLADR_T = 0x06;
|
||||
var GOLD_T = 0x07;
|
||||
var GUARD_T = 0x08;
|
||||
var RUNNER_T = 0x09;
|
||||
|
||||
var REBORN_T = 0x10; //template: for reborn
|
||||
|
||||
var CLOSE_SCREEN_SPEED = 35; //20 ~ 80
|
||||
|
||||
var MAX_GUARD = 6; //maximum number of guards
|
||||
var RUNNER_LIFE = 5; //number of runner life
|
||||
var RUNNER_MAX_LIFE = 100;
|
||||
|
||||
var MAX_TIME_COUNT = 999; //for moden mode
|
||||
var TICK_COUNT_PER_TIME = 16;
|
||||
var MAX_DEMO_WAIT_COUNT = 150 * TICK_COUNT_PER_TIME;
|
||||
|
||||
var MAX_EDIT_LEVEL = 120;
|
||||
|
||||
var MAX_HISCORE_RECORD = 10, MAX_HISCORE_NAME_LENGTH = 10;
|
||||
|
||||
var STORAGE_LASTPLAY_MODE = "loderunner_lastplay";
|
||||
|
||||
var STORAGE_CLASSIC_INFO1 = "loderunner_classicInfo1";
|
||||
var STORAGE_CLASSIC_INFO2 = "loderunner_classicInfo2";
|
||||
|
||||
var STORAGE_MODERN_INFO1 = "loderunner_modernInfo1";
|
||||
var STORAGE_MODERN_INFO2 = "loderunner_modernInfo2";
|
||||
|
||||
var STORAGE_DEMO_INFO1 = "loderunner_demoInfo1";
|
||||
var STORAGE_DEMO_INFO2 = "loderunner_demoInfo2";
|
||||
|
||||
var STORAGE_FIRST_PLAY = "loderunner_firstRun";
|
||||
|
||||
var STORAGE_MODERN_SCORE_INFO1 = "loderunner_modernScore1";
|
||||
var STORAGE_MODERN_SCORE_INFO2 = "loderunner_modernScore2";
|
||||
|
||||
var STORAGE_USER_INFO = "loderunner_userInfo"; //user created
|
||||
var STORAGE_USER_SCORE_INFO = "loderunner_userScore"; //user created
|
||||
|
||||
|
||||
var STORAGE_EDIT_INFO = "loderunner_editInfo";
|
||||
|
||||
var STORAGE_USER_LEVEL = "loderunner_userLevel";
|
||||
var STORAGE_TEST_LEVEL = "loderunner_testlevel";
|
||||
|
||||
var STORAGE_HISCORE_INFO1 = "loderunner_hiScore1";
|
||||
var STORAGE_HISCORE_INFO2 = "loderunner_hiScore2";
|
||||
@@ -0,0 +1,458 @@
|
||||
/////////////////
|
||||
// Auto Demo
|
||||
/////////////////
|
||||
|
||||
var demoRecordIdx, demoGoldIdx, demoBornIdx;
|
||||
var demoTickCount;
|
||||
var demoRnd, demoIdx;
|
||||
|
||||
function initAutoDemoRnd()
|
||||
{
|
||||
demoRnd = [];
|
||||
demoRnd[0] = new rangeRandom(0, demoData1.length-1, 0); //random range 0 .. demoData1.length-1
|
||||
/* auto demo data always use demoData1 (because now can select demo levels from demo mode) , 6/12/2014
|
||||
demoRnd[1] = new rangeRandom(0, demoData2.length-1, 0); //random range 0 .. demoData1.length-2
|
||||
*/
|
||||
}
|
||||
|
||||
var demoRecord, demoGoldDrop, demoBornPos;
|
||||
var demoLevel, demoData, demoCount, demoMaxCount;
|
||||
function getAutoDemoLevel(initValue)
|
||||
{
|
||||
if(initValue) {
|
||||
curScore = 0;
|
||||
runnerLife = 1;
|
||||
/* auto demo data always use demoData1 (because now can select demo levels from demo mode) , 6/12/2014
|
||||
if(playData == 2) { //lode runner 2 demo data
|
||||
demoLevel = 1;
|
||||
demoCount = 1;
|
||||
demoMaxCount = 2;
|
||||
demoData = demoData2;
|
||||
levelData = levelData2;
|
||||
demoIdx = 1;
|
||||
} else { //lode runner 1 demo data
|
||||
*/
|
||||
demoLevel = 1;
|
||||
demoCount = 1;
|
||||
demoMaxCount = 3;
|
||||
demoData = demoData1;
|
||||
levelData = levelData1;
|
||||
demoIdx = 0;
|
||||
// }
|
||||
} else {
|
||||
demoLevel++;
|
||||
demoCount++;
|
||||
}
|
||||
var idx = demoRnd[demoIdx].get();
|
||||
|
||||
demoRecord = demoData[idx].action;
|
||||
demoGoldDrop = demoData[idx].goldDrop;
|
||||
demoBornPos = demoData[idx].bornPos;
|
||||
curLevel = demoData[idx].level;
|
||||
}
|
||||
|
||||
var demoCountTime = 0, demoCountEnable = 0;
|
||||
function enableAutoDemoTimer()
|
||||
{
|
||||
demoCountEnable = 1;
|
||||
demoCountTime = 0;
|
||||
}
|
||||
|
||||
function disableAutoDemoTimer()
|
||||
{
|
||||
demoCountEnable = 0;
|
||||
}
|
||||
|
||||
function countAutoDemoTimer()
|
||||
{
|
||||
if(demoCountEnable) {
|
||||
demoCountTime++;
|
||||
//debug(demoCountTime);
|
||||
if(demoCountTime > MAX_DEMO_WAIT_COUNT) {
|
||||
disableAutoDemoTimer();
|
||||
gameState = GAME_WAITING;
|
||||
showCoverPage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//=====================================
|
||||
// function for auto demo & demo mode
|
||||
//=====================================
|
||||
|
||||
function initPlayDemo()
|
||||
{
|
||||
demoRecordIdx = demoGoldIdx = demoBornIdx = 0;
|
||||
demoTickCount = 0;
|
||||
gameState = GAME_RUNNING;
|
||||
}
|
||||
|
||||
function playDemo()
|
||||
{
|
||||
if(demoRecordIdx < demoRecord.length) {
|
||||
if(demoRecord[demoRecordIdx*2] == demoTickCount) {
|
||||
//loadingTxt.text = demoRecordIdx + " " + demoTickCount ; //for debug
|
||||
pressKey(demoRecord[demoRecordIdx*2+1]);
|
||||
demoRecordIdx++;
|
||||
}
|
||||
}
|
||||
demoTickCount++;
|
||||
}
|
||||
|
||||
function getDemoGold(guard)
|
||||
{
|
||||
guard.hasGold = demoGoldDrop[demoGoldIdx++];
|
||||
}
|
||||
|
||||
function getDemoBornPos()
|
||||
{
|
||||
if(demoBornPos[0] == 2) {
|
||||
demoBornIdx += 2;
|
||||
return { x: demoBornPos[demoBornIdx-1], y: demoBornPos[demoBornIdx] };
|
||||
} else {
|
||||
return { x: demoBornPos[++demoBornIdx], y: 1 };
|
||||
}
|
||||
}
|
||||
|
||||
//====================================
|
||||
// for demo mode (User select level)
|
||||
//====================================
|
||||
|
||||
var playerDemoData1 = [], playerDemoData2 = [];
|
||||
var noDemoData1 = 1, noDemoData2 = 1;
|
||||
|
||||
var wHighScores1 = [], wHighScores2 = [];
|
||||
var wDemoData1 = [], wDemoData2 = [];
|
||||
|
||||
function initDemoModeVariable()
|
||||
{
|
||||
for(var i = 0; i < wDemoData1.length; i++) {
|
||||
playerDemoData1[wDemoData1[i].level-1] = wDemoData1[i];
|
||||
}
|
||||
|
||||
for(var i = 0; i < wDemoData2.length; i++) {
|
||||
playerDemoData2[wDemoData2[i].level-1] = wDemoData2[i];
|
||||
}
|
||||
|
||||
if(playerDemoData1.length > 0) noDemoData1 = 0;
|
||||
if(playerDemoData2.length > 0) noDemoData2 = 0;
|
||||
}
|
||||
|
||||
function initDemoInfo()
|
||||
{
|
||||
var idx = curLevel - 1;
|
||||
|
||||
curScore = 0;
|
||||
runnerLife = 1;
|
||||
|
||||
demoRecord = demoData[idx].action;
|
||||
demoGoldDrop = demoData[idx].goldDrop;
|
||||
demoBornPos = demoData[idx].bornPos;
|
||||
assert(curLevel == demoData[idx].level, "curLevel != level of demoData");
|
||||
}
|
||||
|
||||
function getDemoInfo()
|
||||
{
|
||||
var infoJSON;
|
||||
|
||||
if(playData == 5) {
|
||||
infoJSON = getStorage(STORAGE_DEMO_INFO2);
|
||||
levelData = levelData2;
|
||||
demoData = playerDemoData2;
|
||||
} else {
|
||||
infoJSON = getStorage(STORAGE_DEMO_INFO1);
|
||||
levelData = levelData1;
|
||||
demoData = playerDemoData1;
|
||||
}
|
||||
|
||||
if(infoJSON == null) {
|
||||
curLevel = 1;
|
||||
} else {
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
curLevel = infoObj.l;
|
||||
}
|
||||
getValidDemoLevel();
|
||||
initDemoInfo();
|
||||
}
|
||||
|
||||
function setDemoInfo()
|
||||
{
|
||||
var infoObj = { l:curLevel};
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
switch(playData) {
|
||||
default:
|
||||
case 4:
|
||||
setStorage(STORAGE_DEMO_INFO1, infoJSON);
|
||||
break;
|
||||
case 5:
|
||||
setStorage(STORAGE_DEMO_INFO2, infoJSON);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getValidDemoLevel()
|
||||
{
|
||||
while(typeof demoData[curLevel-1] == "undefined") {
|
||||
if(++curLevel > levelData.length) curLevel = 1;
|
||||
}
|
||||
}
|
||||
|
||||
function getNextDemoLevel()
|
||||
{
|
||||
getValidDemoLevel();
|
||||
setDemoInfo();
|
||||
initDemoInfo();
|
||||
}
|
||||
|
||||
function updatePlayerDemoData(playData, demoDataInfo)
|
||||
{
|
||||
var playerDemoData = null;
|
||||
var level = demoDataInfo.level;
|
||||
|
||||
switch(playData) {
|
||||
case 1:
|
||||
playerDemoData = playerDemoData1;
|
||||
break;
|
||||
case 2:
|
||||
playerDemoData = playerDemoData2;
|
||||
break;
|
||||
}
|
||||
|
||||
if(playerDemoData != null) {
|
||||
if(typeof playerDemoData[level-1] == "undefined") {
|
||||
// new
|
||||
playerDemoData[level-1] = {
|
||||
level: demoDataInfo.level,
|
||||
ai: demoDataInfo.ai,
|
||||
time: demoDataInfo.time,
|
||||
state: demoDataInfo.state,
|
||||
action: demoDataInfo.action,
|
||||
goldDrop: demoDataInfo.goldDrop,
|
||||
bornPos: demoDataInfo.bornPos
|
||||
};
|
||||
} else { // always update local data
|
||||
//if( playerDemoData[level-1].time >= demoDataInfo.time) { //only udate best time
|
||||
|
||||
//update
|
||||
playerDemoData[level-1].level = demoDataInfo.level;
|
||||
playerDemoData[level-1].ai = demoDataInfo.ai;
|
||||
playerDemoData[level-1].time = demoDataInfo.time;
|
||||
playerDemoData[level-1].state = demoDataInfo.state;
|
||||
playerDemoData[level-1].action = demoDataInfo.action;
|
||||
playerDemoData[level-1].goldDrop = demoDataInfo.goldDrop;
|
||||
playerDemoData[level-1].bornPos = demoDataInfo.bornPos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================
|
||||
// Record play action for demo
|
||||
//==============================
|
||||
|
||||
var RECORD_NONE = 0, RECORD_KEY = 1, RECORD_PLAY = 2;
|
||||
var recordMode = RECORD_KEY;
|
||||
//var recordMode = RECORD_NONE;
|
||||
|
||||
var recordCount, recordKeyCode = 0, lastKeyCode = -1;
|
||||
var playRecord, goldRecord, bornRecord;
|
||||
var goldRecordIdx, bornRecordIdx;
|
||||
var playRecordTime, recordState;
|
||||
|
||||
function initRecordVariable()
|
||||
{
|
||||
recordCount = 0;
|
||||
goldRecordIdx = 0;
|
||||
bornRecordIdx = 0;
|
||||
playRecordTime = 0;
|
||||
|
||||
switch(recordMode) {
|
||||
case RECORD_KEY:
|
||||
recordKeyCode = 0;
|
||||
lastKeyCode = -1;
|
||||
playRecord = [];
|
||||
goldRecord = [];
|
||||
bornRecord = [];
|
||||
break;
|
||||
case RECORD_PLAY:
|
||||
recordIdx = 0;
|
||||
gameState = GAME_RUNNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function saveKeyCode(code)
|
||||
{
|
||||
recordKeyCode = code
|
||||
}
|
||||
|
||||
function recordModeDump(state)
|
||||
{
|
||||
recordPlayTime(state);
|
||||
convertBornPos();
|
||||
dumpRecord();
|
||||
}
|
||||
|
||||
function recordModeToggle(state)
|
||||
{
|
||||
if(recordMode == RECORD_KEY) {
|
||||
if(playMode != PLAY_AUTO && playMode != PLAY_DEMO) recordMode = RECORD_PLAY;
|
||||
recordModeDump(state);
|
||||
} else recordMode = RECORD_KEY;
|
||||
}
|
||||
|
||||
function processRecordKey()
|
||||
{
|
||||
switch(recordMode) {
|
||||
case RECORD_KEY: //record the play key action
|
||||
recordKeyAction();
|
||||
break;
|
||||
case RECORD_PLAY: //play the record key
|
||||
recordPlayDemo();
|
||||
break;
|
||||
}
|
||||
recordCount++;
|
||||
}
|
||||
|
||||
function recordKeyAction()
|
||||
{
|
||||
if(recordKeyCode != lastKeyCode) {
|
||||
playRecord.push(recordCount);
|
||||
playRecord.push(recordKeyCode);
|
||||
lastKeyCode = recordKeyCode;
|
||||
}
|
||||
}
|
||||
|
||||
var recordIdx;
|
||||
|
||||
function recordPlayDemo()
|
||||
{
|
||||
if(recordIdx < playRecord.length) {
|
||||
/*
|
||||
if(playRecord[recordIdx].count == recordCount) {
|
||||
loadingTxt.text = recordIdx;
|
||||
pressKey(playRecord[recordIdx++].code);
|
||||
}*/
|
||||
if(playRecord[recordIdx*2] == recordCount) {
|
||||
//loadingTxt.text = recordIdx; //for debug
|
||||
pressKey(playRecord[recordIdx*2+1]);
|
||||
recordIdx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function processRecordGold(guard)
|
||||
{
|
||||
switch(recordMode) {
|
||||
case RECORD_KEY: //record the play key action, save gold
|
||||
goldRecord.push(guard.hasGold);
|
||||
break;
|
||||
case RECORD_PLAY: //play the record key, get gold
|
||||
guard.hasGold = goldRecord[goldRecordIdx++];
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function saveRecordBornPos(x, y)
|
||||
{
|
||||
bornRecord.push({ x:x, y:y });
|
||||
}
|
||||
|
||||
function getRecordBornPos()
|
||||
{
|
||||
if(bornRecord[0] == 2) {
|
||||
bornRecordIdx += 2;
|
||||
return { x: bornRecord[bornRecordIdx-1], y: bornRecord[bornRecordIdx] };
|
||||
} else {
|
||||
return { x: bornRecord[++bornRecordIdx], y: 1 };
|
||||
}
|
||||
}
|
||||
|
||||
function recordPlayTime(state)
|
||||
{
|
||||
playRecordTime = recordCount;
|
||||
recordState = (state == GAME_FINISH)?1:0; //finish or dead
|
||||
}
|
||||
|
||||
function convertBornPos()
|
||||
{
|
||||
var len, offset = 1;
|
||||
var tmpRecord = [];
|
||||
|
||||
if((len = bornRecord.length) <= 0) return;
|
||||
|
||||
for(var i = 0; i < len; i++) if(bornRecord[i].y != 1) offset = 2;
|
||||
|
||||
tmpRecord[0] = offset;
|
||||
for(var i = 0; i < len; i++) {
|
||||
tmpRecord[i*offset+1] = bornRecord[i].x;
|
||||
if(offset == 2) tmpRecord[i*offset+2] = bornRecord[i].y;
|
||||
}
|
||||
bornRecord = tmpRecord;
|
||||
}
|
||||
|
||||
var curDemoData;
|
||||
function dumpRecord()
|
||||
{
|
||||
var txtStr;
|
||||
|
||||
curDemoData = {};
|
||||
curDemoData.level = curLevel;
|
||||
curDemoData.ai = AI_VERSION;
|
||||
curDemoData.time = playRecordTime;
|
||||
curDemoData.state = recordState;
|
||||
curDemoData.action = [];
|
||||
curDemoData.goldDrop = [];
|
||||
curDemoData.bornPos = [];
|
||||
|
||||
for(var i = 0; i < playRecord.length; i++) {
|
||||
curDemoData.action[i] = playRecord[i];
|
||||
}
|
||||
|
||||
for(var i = 0; i < goldRecord.length; i++) {
|
||||
curDemoData.goldDrop[i] = goldRecord[i];
|
||||
}
|
||||
|
||||
for(var i = 0; i < bornRecord.length; i++) {
|
||||
curDemoData.bornPos[i] = bornRecord[i];
|
||||
}
|
||||
|
||||
debug(curDemoData);
|
||||
|
||||
debug(" { level: " + curLevel + ",");
|
||||
debug(" ai: " + AI_VERSION + ",");
|
||||
debug(" time: " + playRecordTime + ",");
|
||||
debug(" state: " + recordState + ",");
|
||||
|
||||
if(playRecord.length > 0) {
|
||||
txtStr = " action: [ " + playRecord[0];
|
||||
for(var i = 1; i < playRecord.length; i++) {
|
||||
txtStr += ", " + playRecord[i];
|
||||
}
|
||||
debug(txtStr+ " ], //" + (playRecord.length/2));
|
||||
} else {
|
||||
debug(" action: [ ],");
|
||||
}
|
||||
|
||||
if(goldRecord.length > 0) {
|
||||
txtStr = " goldDrop: [ " + goldRecord[0];
|
||||
for(var i = 1; i < goldRecord.length; i++) {
|
||||
txtStr += ", " + goldRecord[i];
|
||||
}
|
||||
debug(txtStr+ " ],");
|
||||
} else {
|
||||
debug(" goldDrop: [ ],");
|
||||
}
|
||||
if( bornRecord.length > 0) {
|
||||
txtStr = " bornPos: [ " + bornRecord[0];
|
||||
for(var i = 1; i < bornRecord.length; i++) {
|
||||
txtStr += ", " + bornRecord[i];
|
||||
}
|
||||
debug(txtStr+" ]");
|
||||
} else {
|
||||
debug(" bornPos: [ ]");
|
||||
}
|
||||
|
||||
debug(" },");
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
var demoData1 = [
|
||||
/*
|
||||
{ level: 1,
|
||||
ai: 1,
|
||||
time: 755,
|
||||
state: 1,
|
||||
action: [ 0, 39, 63, 38, 75, 37, 96, 90, 134, 37, 149, 38, 181, 39, 206, 38, 222, 37, 312, 38, 324, 37, 340, 88, 352, 39, 374, 88, 391, 39, 407, 88, 425, 39, 508, 40, 519, 39, 585, 38, 597, 37, 631, 38, 664, 39, 688, 38, 703, 37, 738, 38 ], //26
|
||||
goldDrop: [ 29 ]
|
||||
},
|
||||
{ level: 2,
|
||||
ai: 1,
|
||||
time: 988,
|
||||
state: 1,
|
||||
action: [ 0, 37, 18, 38, 35, 39, 49, 38, 104, 39, 170, 37, 182, 38, 190, 37, 201, 90, 213, 39, 217, 90, 282, 37, 371, 38, 399, 37, 408, 39, 418, 40, 428, 37, 452, 90, 512, 37, 524, 38, 544, 39, 575, 40, 607, 37, 636, 90, 647, 39, 651, 90, 660, 37, 668, 90, 678, 37, 692, 88, 708, 39, 826, 38, 859, 39, 878, 40, 896, 39, 910, 37, 918, 38, 933, 39, 944, 38 ], //39
|
||||
goldDrop: [ 22, 29, 16 ],
|
||||
bornPos: [ 1, 18, 20 ]
|
||||
},
|
||||
{ level: 3,
|
||||
ai: 1,
|
||||
time: 242,
|
||||
state: 0,
|
||||
action: [ 0, 39, 66, 38, 80, 39, 145, 38, 164, 37, 187, 38, 197, 37, 230, 38 ] //8
|
||||
},
|
||||
{ level: 4,
|
||||
ai: 1,
|
||||
time: 1097,
|
||||
state: 1,
|
||||
action: [ 0, 37, 40, 88, 54, 37, 64, 88, 75, 37, 82, 38, 104, 37, 114, 39, 157, 37, 169, 88, 200, 37, 234, 38, 307, 39, 334, 37, 349, 40, 362, 39, 383, 40, 395, 39, 419, 38, 435, 37, 458, 38, 474, 39, 522, 90, 531, 37, 547, 40, 581, 39, 599, 38, 615, 39, 622, 38, 627, 37, 631, 38, 648, 39, 658, 40, 672, 39, 688, 37, 697, 88, 725, 39, 750, 38, 768, 40, 801, 37, 923, 38, 945, 37, 965, 90, 976, 39, 980, 90, 1021, 37, 1042, 38 ], //47
|
||||
goldDrop: [ 28, 25, 16 ],
|
||||
bornPos: [ 1, 24 ]
|
||||
},
|
||||
{ level: 5,
|
||||
ai: 1,
|
||||
time: 748,
|
||||
state: 1,
|
||||
action: [ 0, 37, 23, 88, 32, 37, 61, 90, 92, 37, 107, 90, 157, 37, 167, 38, 200, 39, 216, 37, 222, 38, 238, 37, 247, 39, 256, 40, 272, 39, 370, 38, 386, 39, 425, 37, 434, 90, 485, 37, 499, 38, 515, 37, 530, 38, 546, 39, 588, 37, 608, 38, 630, 37, 709, 38 ], //28
|
||||
bornPos: [ 1, 7, 9 ]
|
||||
},
|
||||
{ level: 7,
|
||||
ai: 1,
|
||||
time: 1798,
|
||||
state: 1,
|
||||
action: [ 0, 39, 46, 37, 101, 38, 119, 37, 143, 38, 160, 88, 192, 39, 210, 38, 218, 37, 222, 38, 240, 40, 257, 38, 273, 39, 294, 37, 302, 90, 316, 39, 320, 90, 387, 37, 394, 39, 472, 40, 536, 39, 542, 88, 566, 37, 570, 88, 685, 39, 699, 38, 758, 37, 768, 90, 780, 37, 810, 40, 841, 39, 847, 88, 876, 39, 885, 37, 910, 88, 953, 37, 957, 88, 969, 37, 974, 88, 986, 37, 1015, 38, 1031, 37, 1056, 38, 1073, 39, 1100, 88, 1160, 39, 1240, 38, 1284, 39, 1308, 90, 1320, 37, 1342, 90, 1362, 39, 1367, 90, 1377, 37, 1395, 88, 1407, 39, 1417, 90, 1430, 37, 1520, 40, 1658, 37, 1669, 38, 1686, 37, 1710, 38, 1725, 39, 1740, 38, 1772, 37, 1787, 38 ], //67
|
||||
goldDrop: [ 26 ],
|
||||
bornPos: [ 1, 15, 16, 3, 13, 8, 9 ]
|
||||
},
|
||||
*/
|
||||
{ level: 11,
|
||||
ai: 1,
|
||||
time: 721,
|
||||
state: 1,
|
||||
action: [ 0, 39, 32, 37, 43, 38, 54, 39, 63, 38, 73, 37, 83, 38, 93, 39, 102, 38, 111, 37, 120, 38, 129, 39, 137, 38, 146, 37, 155, 38, 164, 39, 172, 38, 181, 37, 189, 38, 199, 39, 207, 38, 218, 37, 224, 38, 247, 39, 256, 90, 275, 39, 278, 90, 294, 39, 298, 90, 314, 39, 317, 90, 334, 39, 339, 90, 562, 40, 570, 90, 590, 38, 597, 90, 650, 37, 710, 38 ], //39
|
||||
goldDrop: [ 24, 22, 22, 15, 38 ],
|
||||
bornPos: [ 1, 3, 0, 22, 17 ]
|
||||
},
|
||||
{ level: 12,
|
||||
ai: 1,
|
||||
time: 1495,
|
||||
state: 1,
|
||||
action: [ 0, 39, 12, 37, 91, 90, 131, 37, 151, 38, 172, 39, 218, 37, 237, 38, 254, 39, 259, 38, 268, 39, 272, 38, 280, 39, 285, 38, 294, 39, 298, 38, 310, 39, 354, 38, 365, 37, 424, 90, 505, 37, 516, 90, 532, 39, 537, 90, 552, 39, 585, 88, 595, 39, 631, 40, 640, 37, 654, 88, 667, 39, 684, 40, 699, 39, 758, 38, 780, 39, 798, 37, 811, 38, 831, 39, 847, 37, 860, 38, 881, 39, 897, 37, 973, 90, 1025, 37, 1076, 90, 1087, 39, 1093, 90, 1104, 39, 1110, 90, 1120, 37, 1137, 90, 1148, 39, 1156, 90, 1166, 37, 1174, 90, 1188, 37, 1201, 39, 1215, 39, 1216, 39, 1249, 37, 1281, 88, 1293, 39, 1334, 88, 1372, 38, 1389, 39, 1394, 38, 1401, 39, 1405, 38, 1411, 39, 1415, 38, 1422, 39, 1428, 38, 1441, 39, 1484, 38 ], //74
|
||||
goldDrop: [ 30 ],
|
||||
bornPos: [ 1, 22 ]
|
||||
},
|
||||
{ level: 22,
|
||||
ai: 1,
|
||||
time: 1335,
|
||||
state: 1,
|
||||
action: [ 0, 39, 46, 37, 84, 38, 104, 39, 166, 37, 190, 38, 206, 39, 232, 38, 249, 37, 308, 40, 322, 37, 332, 90, 379, 37, 398, 38, 421, 37, 427, 38, 444, 39, 531, 37, 569, 38, 584, 37, 679, 88, 686, 39, 733, 39, 744, 38, 759, 39, 767, 37, 783, 39, 896, 38, 916, 39, 951, 38, 962, 39, 986, 37, 998, 88, 1042, 39, 1058, 38, 1075, 37, 1101, 90, 1154, 37, 1167, 90, 1181, 88, 1204, 37, 1248, 38, 1257, 37, 1263, 38, 1279, 39, 1324, 38 ], //46
|
||||
goldDrop: [ 23, 28 ]
|
||||
},
|
||||
{ level: 31,
|
||||
ai: 1,
|
||||
time: 561,
|
||||
state: 1,
|
||||
action: [ 0, 39, 8, 37, 21, 38, 27, 37, 33, 38, 49, 37, 66, 38, 73, 37, 81, 38, 87, 37, 94, 38, 110, 37, 128, 38, 133, 37, 141, 38, 147, 37, 153, 38, 160, 37, 169, 38, 174, 37, 181, 38, 188, 37, 197, 39, 297, 40, 309, 39, 314, 40, 325, 39, 339, 38, 354, 39, 372, 38, 379, 39, 388, 38, 394, 39, 401, 38, 417, 39, 435, 38, 440, 39, 447, 38, 453, 39, 459, 38, 463, 39, 473, 37, 540, 38, 552, 37, 555, 38 ] //45
|
||||
},
|
||||
{ level: 44,
|
||||
ai: 1,
|
||||
time: 686,
|
||||
state: 1,
|
||||
action: [ 0, 37, 39, 88, 83, 39, 98, 40, 131, 37, 142, 39, 200, 38, 238, 39, 290, 40, 298, 37, 302, 40, 336, 37, 367, 39, 407, 37, 416, 38, 452, 40, 459, 38, 465, 39, 524, 90, 580, 37, 595, 40, 621, 39, 647, 38 ], //23
|
||||
goldDrop: [ 15 ]
|
||||
},
|
||||
{ level: 48,
|
||||
ai: 1,
|
||||
time: 783,
|
||||
state: 0,
|
||||
action: [ 0, 40, 30, 37, 64, 38, 76, 39, 97, 38, 109, 37, 128, 38, 142, 39, 160, 38, 171, 37, 180, 39, 190, 40, 202, 37, 218, 40, 231, 37, 233, 40, 245, 39, 263, 40, 279, 37, 300, 40, 313, 39, 335, 40, 347, 37, 367, 40, 381, 39, 394, 37, 422, 39, 428, 37, 435, 88, 470, 39, 475, 37, 505, 90, 569, 37, 579, 38, 592, 39, 600, 38, 609, 39, 617, 38, 625, 39, 633, 38, 640, 39, 646, 38, 653, 39, 660, 38, 668, 39, 673, 38, 697, 37, 708, 39, 770, 37 ], //49
|
||||
goldDrop: [ 24 ]
|
||||
},
|
||||
{ level: 56,
|
||||
ai: 1,
|
||||
time: 1552,
|
||||
state: 1,
|
||||
action: [ 0, 39, 6, 38, 83, 37, 104, 38, 112, 37, 145, 39, 161, 38, 172, 40, 219, 39, 225, 90, 240, 39, 254, 37, 260, 88, 271, 40, 281, 37, 289, 90, 297, 39, 300, 90, 311, 39, 316, 90, 326, 39, 333, 90, 343, 37, 359, 90, 371, 39, 378, 90, 395, 37, 403, 39, 415, 90, 534, 37, 551, 39, 588, 38, 666, 39, 688, 40, 737, 39, 743, 90, 759, 39, 772, 37, 777, 88, 796, 40, 804, 37, 810, 90, 821, 39, 826, 90, 838, 39, 842, 90, 852, 37, 867, 90, 878, 39, 886, 90, 896, 37, 904, 90, 918, 37, 953, 38, 1032, 39, 1121, 37, 1156, 40, 1173, 37, 1185, 39, 1235, 39, 1239, 90, 1254, 39, 1267, 37, 1272, 88, 1284, 40, 1292, 37, 1298, 90, 1309, 39, 1314, 90, 1326, 39, 1330, 90, 1342, 37, 1356, 90, 1367, 39, 1374, 90, 1386, 37, 1392, 90, 1407, 37, 1475, 38 ] //79
|
||||
},
|
||||
{ level: 64,
|
||||
ai: 1,
|
||||
time: 4069,
|
||||
state: 1,
|
||||
action: [ 0, 39, 32, 37, 134, 38, 149, 39, 193, 38, 222, 39, 293, 40, 306, 37, 343, 39, 381, 38, 394, 37, 438, 38, 450, 39, 485, 38, 497, 37, 521, 38, 532, 39, 554, 37, 646, 38, 670, 37, 720, 39, 728, 90, 743, 39, 747, 90, 758, 39, 764, 90, 776, 39, 783, 90, 796, 39, 801, 90, 812, 39, 818, 90, 982, 39, 1009, 37, 1014, 90, 1028, 39, 1032, 90, 1088, 37, 1108, 88, 1121, 37, 1126, 88, 1139, 37, 1144, 88, 1156, 37, 1162, 88, 1174, 37, 1179, 88, 1406, 39, 1430, 88, 1442, 37, 1448, 88, 1460, 37, 1465, 88, 1476, 37, 1481, 88, 1493, 37, 1498, 88, 1509, 37, 1514, 88, 1524, 37, 1529, 88, 1540, 37, 1546, 88, 1554, 37, 1574, 38, 1591, 39, 1638, 38, 1655, 37, 1696, 38, 1707, 39, 1736, 38, 1747, 37, 1766, 38, 1777, 39, 1858, 37, 1873, 88, 1887, 37, 1891, 88, 1904, 37, 1909, 88, 1921, 37, 1926, 88, 1938, 37, 1943, 88, 1955, 37, 1960, 88, 1970, 37, 1975, 88, 2182, 39, 2221, 37, 2228, 88, 2243, 37, 2247, 88, 2261, 37, 2265, 88, 2277, 37, 2282, 88, 2292, 37, 2297, 88, 2527, 37, 2533, 88, 2562, 39, 2597, 90, 2613, 39, 2616, 90, 2629, 39, 2634, 90, 2646, 39, 2651, 90, 2663, 39, 2668, 90, 2679, 39, 2683, 90, 2909, 37, 2944, 88, 2959, 37, 2963, 88, 2977, 37, 2981, 88, 2994, 37, 2999, 88, 3012, 37, 3016, 88, 3029, 37, 3033, 88, 3279, 39, 3309, 37, 3316, 88, 3331, 37, 3334, 88, 3346, 37, 3350, 88, 3361, 37, 3362, 88, 3374, 37, 3377, 88, 3390, 37, 3394, 88, 3578, 39, 3610, 37, 3668, 40, 3858, 37, 3866, 38, 3876, 39, 3880, 38, 3894, 39, 3948, 38, 4004, 37, 4063, 38 ], //149
|
||||
goldDrop: [ 21, 17, 33, 17, 25, 20, 29, 39, 27, 30, 26, 34, 20, 38, 20, 24, 35, 38, 38, 26, 16, 15, 15, 35, 30, 14, 28, 28, 28, 34, 20, 18, 18, 21, 22, 23, 14 ],
|
||||
bornPos: [ 1, 5, 6, 13, 23, 24, 4, 21, 22, 7, 1, 3, 26, 25, 19, 2, 10, 6, 19, 24, 7, 17 ]
|
||||
},
|
||||
{ level: 80,
|
||||
ai: 1,
|
||||
time: 2387,
|
||||
state: 1,
|
||||
action: [ 0, 90, 13, 39, 47, 38, 127, 37, 140, 39, 152, 37, 191, 38, 297, 37, 336, 40, 349, 39, 359, 37, 368, 39, 395, 37, 439, 39, 448, 90, 462, 40, 466, 90, 477, 40, 482, 90, 494, 37, 518, 39, 533, 38, 669, 37, 679, 90, 690, 37, 725, 39, 826, 38, 835, 90, 901, 38, 970, 90, 979, 40, 986, 90, 1001, 37, 1033, 37, 1040, 90, 1058, 40, 1062, 90, 1075, 37, 1101, 39, 1109, 38, 1144, 39, 1186, 40, 1219, 39, 1232, 40, 1283, 38, 1362, 37, 1444, 40, 1462, 39, 1466, 90, 1481, 37, 1488, 38, 1517, 37, 1544, 38, 1585, 37, 1590, 90, 1654, 37, 1664, 38, 1688, 37, 1707, 38, 1724, 39, 1746, 38, 1765, 39, 1768, 38, 1801, 40, 1837, 90, 1864, 39, 1883, 38, 1930, 40, 1944, 40, 1945, 40, 1946, 40, 1947, 40, 1948, 40, 1949, 40, 1950, 40, 1951, 40, 1952, 40, 1953, 40, 1954, 40, 1955, 40, 1956, 40, 1957, 40, 1958, 40, 1959, 40, 1960, 40, 1961, 40, 1962, 40, 1963, 40, 1965, 88, 2011, 39, 2076, 88, 2089, 37, 2095, 88, 2153, 39, 2169, 38, 2179, 90, 2194, 38, 2199, 90, 2325, 38 ], //99
|
||||
goldDrop: [ 17, 14, 15, 36, 19 ],
|
||||
bornPos: [ 1, 15, 8 ]
|
||||
},
|
||||
{ level: 80,
|
||||
ai: 1,
|
||||
time: 1652,
|
||||
state: 0,
|
||||
action: [ 0, 37, 2, 90, 15, 39, 44, 90, 57, 39, 60, 90, 69, 38, 149, 90, 162, 40, 165, 90, 175, 37, 225, 39, 234, 90, 250, 40, 252, 90, 266, 37, 303, 38, 316, 39, 330, 39, 367, 38, 371, 90, 531, 38, 578, 37, 646, 90, 691, 37, 709, 90, 722, 40, 728, 90, 741, 40, 746, 90, 756, 37, 786, 39, 808, 37, 817, 38, 831, 37, 837, 40, 852, 37, 865, 39, 890, 90, 904, 39, 924, 90, 935, 39, 937, 90, 956, 39, 957, 90, 973, 39, 976, 90, 1042, 39, 1076, 38, 1156, 37, 1222, 40, 1229, 38, 1237, 37, 1251, 39, 1257, 37, 1266, 39, 1283, 90, 1293, 37, 1321, 39, 1329, 37, 1342, 39, 1358, 37, 1366, 90, 1378, 37, 1411, 39, 1472, 37, 1478, 88, 1511, 39, 1548, 88, 1558, 37, 1563, 88, 1573, 37, 1586, 90, 1591, 39, 1599, 88, 1602, 90, 1615, 39, 1621, 90 ], //78
|
||||
goldDrop: [ 27, 34, 16, 16, 37, 39, 26, 27, 25, 33, 32, 19 ],
|
||||
bornPos: [ 1, 6, 7, 27, 8, 26, 11 ]
|
||||
},
|
||||
{ level: 95,
|
||||
ai: 1,
|
||||
time: 2002,
|
||||
state: 1,
|
||||
action: [ 0, 37, 8, 39, 39, 37, 94, 39, 109, 38, 120, 39, 144, 90, 186, 37, 209, 38, 221, 40, 234, 88, 242, 38, 280, 37, 288, 40, 333, 39, 339, 38, 383, 37, 389, 38, 407, 37, 420, 38, 425, 37, 444, 38, 473, 40, 509, 39, 564, 38, 574, 39, 597, 90, 654, 37, 678, 38, 710, 37, 717, 38, 738, 37, 753, 38, 865, 40, 929, 39, 952, 38, 964, 39, 981, 90, 1027, 37, 1042, 38, 1074, 37, 1081, 38, 1104, 37, 1138, 40, 1190, 37, 1194, 37, 1209, 38, 1217, 37, 1224, 39, 1233, 38, 1237, 37, 1243, 38, 1250, 90, 1278, 38, 1282, 37, 1287, 90, 1301, 39, 1333, 37, 1348, 38, 1359, 37, 1379, 38, 1419, 39, 1468, 38, 1520, 37, 1543, 38, 1632, 37, 1659, 40, 1712, 37, 1723, 88, 1816, 39, 1834, 40, 1848, 39, 1855, 37, 1864, 38, 1873, 37, 1888, 38, 1901, 39, 1906, 38, 1916, 39, 1932, 38, 1961, 37, 1980, 38 ], //82
|
||||
goldDrop: [ 35, 15, 39, 28 ]
|
||||
},
|
||||
{ level: 118,
|
||||
ai: 1,
|
||||
time: 3184,
|
||||
state: 1,
|
||||
action: [ 0, 39, 31, 88, 52, 37, 56, 90, 91, 39, 103, 37, 111, 38, 141, 37, 159, 38, 176, 37, 183, 38, 225, 39, 230, 38, 236, 37, 294, 40, 318, 37, 350, 40, 365, 39, 373, 88, 420, 39, 449, 88, 458, 37, 464, 88, 508, 39, 565, 37, 573, 38, 583, 37, 589, 38, 600, 37, 605, 38, 632, 39, 637, 38, 647, 37, 703, 40, 711, 39, 724, 39, 729, 39, 735, 39, 739, 39, 809, 88, 820, 37, 822, 88, 844, 90, 868, 39, 879, 38, 901, 37, 906, 38, 935, 39, 940, 38, 951, 37, 1001, 38, 1071, 40, 1083, 39, 1179, 38, 1201, 37, 1206, 38, 1233, 39, 1239, 38, 1251, 37, 1316, 40, 1330, 37, 1369, 40, 1384, 39, 1394, 88, 1406, 39, 1465, 38, 1483, 39, 1503, 38, 1524, 37, 1528, 38, 1562, 39, 1567, 38, 1574, 37, 1643, 40, 1703, 88, 1715, 39, 1781, 38, 1796, 39, 1817, 38, 1839, 37, 1844, 38, 1876, 39, 1882, 38, 1889, 37, 1962, 40, 2022, 88, 2034, 39, 2061, 40, 2072, 39, 2116, 38, 2132, 39, 2153, 38, 2175, 37, 2180, 38, 2212, 39, 2217, 38, 2224, 37, 2314, 40, 2326, 39, 2366, 40, 2380, 88, 2393, 39, 2461, 38, 2479, 39, 2500, 38, 2523, 37, 2528, 38, 2557, 39, 2562, 38, 2572, 37, 2616, 40, 2671, 39, 2724, 38, 2746, 37, 2750, 38, 2783, 39, 2789, 38, 2798, 37, 2837, 40, 2853, 39, 2940, 38, 2963, 37, 2967, 38, 2977, 39, 3011, 40, 3025, 39, 3048, 40, 3059, 37, 3113, 38, 3130, 37, 3135, 38, 3168, 39, 3173, 38 ], //133
|
||||
goldDrop: [ 34 ],
|
||||
bornPos: [ 1, 12 ]
|
||||
},
|
||||
{ level: 118,
|
||||
ai: 1,
|
||||
time: 1686,
|
||||
state: 0,
|
||||
action: [ 0, 37, 28, 90, 39, 39, 80, 37, 85, 88, 94, 37, 97, 88, 109, 37, 114, 88, 183, 39, 198, 38, 219, 37, 224, 38, 257, 39, 262, 38, 268, 37, 328, 38, 368, 40, 382, 39, 476, 88, 522, 39, 532, 38, 550, 37, 555, 38, 588, 39, 593, 38, 603, 37, 657, 40, 669, 39, 732, 90, 743, 39, 749, 90, 760, 39, 765, 90, 780, 39, 813, 38, 827, 37, 834, 38, 843, 37, 849, 38, 876, 39, 882, 38, 892, 37, 942, 40, 953, 39, 975, 39, 1048, 38, 1064, 39, 1067, 38, 1084, 37, 1089, 38, 1126, 39, 1131, 38, 1139, 37, 1201, 40, 1215, 37, 1228, 37, 1229, 37, 1230, 37, 1231, 37, 1232, 37, 1233, 37, 1267, 40, 1279, 39, 1297, 88, 1306, 37, 1315, 88, 1337, 37, 1343, 88, 1368, 39, 1443, 38, 1462, 37, 1469, 38, 1503, 39, 1508, 38, 1518, 37, 1583, 40, 1593, 37, 1643, 40, 1658, 39, 1673, 88, 1681, 37 ], //82
|
||||
goldDrop: [ 31, 33, 20, 31, 26, 27 ],
|
||||
bornPos: [ 1, 5, 8 ]
|
||||
},
|
||||
{ level: 119,
|
||||
ai: 1,
|
||||
time: 2915,
|
||||
state: 1,
|
||||
action: [ 0, 37, 17, 40, 34, 39, 52, 37, 68, 38, 128, 39, 236, 37, 273, 39, 333, 37, 343, 39, 349, 88, 445, 39, 459, 38, 475, 39, 488, 37, 494, 38, 508, 37, 510, 38, 531, 88, 541, 39, 583, 90, 594, 37, 603, 39, 621, 90, 633, 37, 668, 90, 721, 37, 732, 38, 770, 88, 781, 39, 801, 38, 812, 39, 830, 38, 874, 37, 928, 90, 942, 37, 957, 90, 971, 37, 986, 39, 1029, 38, 1054, 37, 1060, 38, 1074, 88, 1117, 39, 1124, 38, 1134, 39, 1138, 38, 1175, 88, 1184, 39, 1226, 38, 1272, 37, 1308, 90, 1326, 37, 1333, 39, 1347, 39, 1348, 39, 1380, 40, 1393, 90, 1407, 40, 1410, 90, 1457, 37, 1472, 39, 1477, 90, 1488, 37, 1542, 88, 1575, 37, 1617, 38, 1629, 37, 1633, 90, 1692, 37, 1706, 37, 1707, 37, 1708, 37, 1733, 39, 1746, 38, 1758, 37, 1784, 38, 1850, 39, 1865, 90, 1880, 37, 1903, 37, 1920, 38, 2001, 39, 2024, 39, 2037, 39, 2038, 39, 2039, 39, 2040, 39, 2041, 39, 2042, 39, 2043, 39, 2044, 39, 2045, 39, 2046, 39, 2047, 39, 2059, 90, 2130, 37, 2150, 38, 2180, 39, 2188, 88, 2200, 39, 2209, 88, 2229, 39, 2282, 90, 2317, 37, 2338, 38, 2382, 39, 2389, 38, 2435, 39, 2470, 90, 2483, 37, 2499, 39, 2509, 90, 2522, 37, 2533, 39, 2633, 88, 2649, 37, 2653, 88, 2748, 39, 2763, 38, 2801, 88, 2812, 39, 2851, 38, 2894, 37, 2909, 38 ], //125
|
||||
goldDrop: [ 37, 17 ],
|
||||
bornPos: [ 1, 15, 12 ]
|
||||
},
|
||||
{ level: 121,
|
||||
ai: 1,
|
||||
time: 3642,
|
||||
state: 1,
|
||||
action: [ 0, 37, 44, 38, 51, 37, 57, 38, 67, 39, 77, 38, 88, 39, 98, 40, 110, 37, 131, 38, 137, 37, 144, 38, 153, 39, 162, 38, 172, 39, 179, 40, 196, 37, 206, 38, 210, 37, 213, 38, 220, 39, 231, 38, 241, 39, 250, 38, 261, 39, 271, 38, 282, 39, 290, 38, 318, 39, 346, 38, 358, 39, 374, 38, 432, 39, 469, 40, 480, 39, 492, 38, 500, 39, 507, 40, 558, 37, 569, 38, 577, 37, 587, 38, 595, 37, 605, 38, 613, 37, 623, 38, 630, 37, 636, 38, 646, 39, 656, 38, 666, 39, 675, 38, 684, 39, 692, 38, 708, 39, 714, 40, 745, 37, 758, 37, 759, 37, 760, 37, 768, 38, 774, 37, 785, 38, 791, 37, 801, 38, 814, 39, 823, 38, 833, 39, 839, 38, 853, 39, 857, 38, 873, 39, 880, 40, 904, 37, 922, 38, 928, 37, 937, 38, 952, 39, 963, 38, 974, 39, 981, 40, 1010, 39, 1016, 40, 1039, 37, 1044, 39, 1051, 38, 1058, 37, 1069, 38, 1079, 37, 1085, 40, 1102, 39, 1111, 38, 1118, 39, 1123, 38, 1131, 37, 1142, 38, 1150, 37, 1161, 38, 1170, 37, 1177, 40, 1194, 39, 1218, 38, 1226, 39, 1231, 38, 1238, 37, 1247, 38, 1255, 37, 1266, 38, 1275, 37, 1286, 38, 1314, 37, 1319, 40, 1352, 39, 1478, 38, 1484, 39, 1488, 38, 1496, 37, 1505, 38, 1512, 37, 1522, 38, 1528, 37, 1538, 38, 1548, 37, 1569, 38, 1619, 40, 1660, 39, 1767, 38, 1773, 39, 1777, 38, 1796, 37, 1807, 38, 1815, 37, 1826, 38, 1835, 37, 1844, 38, 1879, 37, 1888, 40, 1920, 39, 1996, 38, 2003, 39, 2006, 38, 2015, 37, 2025, 38, 2032, 37, 2041, 38, 2049, 37, 2057, 38, 2066, 37, 2114, 40, 2123, 39, 2140, 39, 2192, 38, 2200, 39, 2204, 38, 2212, 37, 2223, 38, 2230, 37, 2240, 38, 2248, 37, 2259, 38, 2268, 37, 2282, 38, 2309, 37, 2332, 38, 2344, 37, 2360, 38, 2373, 37, 2380, 40, 2397, 37, 2409, 38, 2418, 37, 2429, 38, 2440, 37, 2447, 40, 2490, 39, 2504, 38, 2512, 39, 2522, 40, 2540, 39, 2553, 38, 2566, 38, 2568, 37, 2572, 38, 2582, 39, 2591, 38, 2601, 39, 2609, 38, 2628, 39, 2634, 40, 2657, 39, 2814, 38, 2833, 39, 2838, 38, 2844, 37, 2852, 38, 2858, 37, 2867, 38, 2872, 37, 2881, 38, 2886, 37, 2899, 38, 2918, 37, 2929, 38, 2933, 37, 2944, 38, 2948, 37, 2960, 38, 2966, 37, 2979, 38, 2983, 37, 3007, 40, 3016, 39, 3036, 37, 3046, 38, 3067, 37, 3072, 40, 3081, 39, 3095, 39, 3096, 39, 3097, 39, 3098, 39, 3099, 39, 3100, 39, 3101, 39, 3102, 39, 3103, 39, 3104, 39, 3105, 39, 3106, 39, 3107, 39, 3108, 39, 3109, 39, 3110, 39, 3111, 39, 3112, 39, 3113, 39, 3114, 39, 3115, 39, 3116, 39, 3117, 39, 3118, 39, 3121, 38, 3128, 39, 3138, 38, 3145, 39, 3155, 38, 3166, 39, 3171, 38, 3178, 37, 3187, 38, 3194, 37, 3200, 40, 3210, 39, 3224, 39, 3225, 39, 3226, 39, 3227, 39, 3228, 39, 3232, 38, 3242, 37, 3251, 38, 3258, 37, 3267, 38, 3285, 37, 3292, 40, 3301, 39, 3315, 39, 3316, 39, 3317, 39, 3318, 39, 3319, 39, 3320, 39, 3321, 39, 3322, 39, 3323, 39, 3324, 39, 3325, 39, 3326, 39, 3327, 39, 3328, 39, 3329, 39, 3330, 39, 3331, 39, 3332, 39, 3334, 40, 3357, 39, 3472, 38, 3478, 39, 3482, 38, 3490, 37, 3498, 38, 3505, 37, 3515, 38, 3522, 37, 3533, 38, 3541, 37, 3555, 38, 3580, 37, 3604, 38, 3610, 37, 3620, 38 ], //301
|
||||
goldDrop: [ 30, 32, 32, 15, 26, 27, 23 ]
|
||||
},
|
||||
{ level: 134,
|
||||
ai: 1,
|
||||
time: 2422,
|
||||
state: 1,
|
||||
action: [ 0, 39, 4, 38, 60, 90, 89, 37, 101, 88, 111, 37, 120, 38, 125, 90, 150, 37, 163, 88, 173, 38, 180, 37, 187, 90, 216, 37, 226, 38, 232, 37, 247, 38, 254, 37, 269, 38, 276, 37, 288, 38, 295, 37, 303, 38, 310, 37, 315, 90, 327, 37, 356, 39, 360, 88, 372, 39, 391, 88, 401, 39, 422, 88, 432, 39, 461, 40, 466, 39, 479, 37, 483, 88, 493, 39, 542, 88, 554, 37, 560, 88, 640, 39, 655, 38, 688, 37, 697, 90, 708, 88, 756, 37, 766, 38, 773, 37, 789, 38, 796, 37, 812, 38, 820, 37, 835, 38, 842, 37, 846, 90, 880, 37, 891, 38, 897, 37, 915, 38, 921, 37, 931, 39, 939, 90, 965, 37, 979, 38, 984, 37, 999, 38, 1005, 37, 1012, 90, 1020, 37, 1027, 39, 1032, 90, 1041, 37, 1049, 40, 1120, 39, 1202, 38, 1221, 39, 1234, 88, 1243, 37, 1246, 88, 1265, 39, 1315, 88, 1325, 37, 1330, 88, 1342, 37, 1347, 88, 1359, 37, 1363, 88, 1374, 37, 1379, 88, 1566, 39, 1595, 38, 1628, 37, 1647, 38, 1656, 37, 1669, 38, 1676, 37, 1680, 90, 1691, 39, 1695, 90, 1706, 39, 1720, 90, 1731, 39, 1736, 90, 1749, 39, 1761, 90, 1772, 39, 1777, 90, 1787, 39, 1793, 90, 1926, 40, 1931, 39, 1947, 40, 1952, 39, 1971, 40, 1977, 39, 2011, 40, 2026, 37, 2040, 88, 2115, 39, 2130, 38, 2164, 37, 2185, 38, 2192, 37, 2200, 90, 2208, 39, 2212, 90, 2224, 39, 2228, 90, 2268, 37, 2283, 38, 2289, 37, 2305, 38, 2311, 37, 2327, 38, 2333, 37, 2349, 38, 2354, 37, 2371, 38, 2379, 37, 2395, 38, 2401, 37, 2416, 38 ], //143
|
||||
bornPos: [ 1, 3, 4, 5, 6, 5, 6, 3, 4 ]
|
||||
}
|
||||
];
|
||||
@@ -0,0 +1,955 @@
|
||||
var emptyTile, actTile;
|
||||
var cursorTileObj;
|
||||
var editMap;
|
||||
|
||||
var MAX_EDIT_GUARD = 5; //maximum number of guards
|
||||
var EMPTY_ID = 0, GUARD_ID = 8, RUNNER_ID = 9;
|
||||
|
||||
//value | Character | Type
|
||||
//------+-----------+-----------
|
||||
// 0x0 | <space> | Empty space
|
||||
// 0x1 | # | Normal Brick
|
||||
// 0x2 | @ | Solid Brick
|
||||
// 0x3 | H | Ladder
|
||||
// 0x4 | - | Hand-to-hand bar (Line of rope)
|
||||
// 0x5 | X | False brick
|
||||
// 0x6 | S | Ladder appears at end of level
|
||||
// 0x7 | $ | Gold chest
|
||||
// 0x8 | 0 | Guard
|
||||
// 0x9 | & | Player
|
||||
|
||||
var tileInfo = [
|
||||
[ "eraser", ' ' ], //(0), empty
|
||||
[ "brick", '#' ], //(1)
|
||||
[ "solid", '@' ], //(2)
|
||||
[ "ladder", 'H' ], //(3)
|
||||
[ "rope", '-' ], //(4)
|
||||
[ "trapBrick",'X' ], //(5)
|
||||
[ "hladder", 'S' ], //(6)
|
||||
[ "gold", '$' ], //(7)
|
||||
[ "guard1", '0' ], //(8)
|
||||
[ "runner1", '&' ] //(9)
|
||||
];
|
||||
|
||||
var baseTile=[];
|
||||
var lastRunner = null;
|
||||
var lastGuardList = [];
|
||||
var editBorder;
|
||||
var testLevelInfo = {level: -1};
|
||||
|
||||
function startEditMode()
|
||||
{
|
||||
playMode = PLAY_EDIT;
|
||||
mainStage.removeAllChildren();
|
||||
//document.onkeydown = function() { return true; };
|
||||
document.onkeydown = editHandleKeyDown;
|
||||
|
||||
////getEditLevelInfo(); //move to main.js
|
||||
setEditSelectMenu();
|
||||
|
||||
canvasEditReSize();
|
||||
createBaseTile();
|
||||
createEditMap();
|
||||
startEditTicker();
|
||||
setButtonState();
|
||||
}
|
||||
|
||||
function setEditSelectMenu()
|
||||
{
|
||||
if(editLevels>0)selectIconObj.enable();
|
||||
else selectIconObj.disable(1);
|
||||
}
|
||||
|
||||
function back2EditMode(rc)
|
||||
{
|
||||
if(rc == 1) { //pass
|
||||
testLevelInfo.pass = 1;
|
||||
setTestLevel(testLevelInfo);
|
||||
//enableSaveButton();
|
||||
} else { //fail
|
||||
//if(testLevelInfo.pass && !testLevelInfo.modified) enableSaveButton();
|
||||
}
|
||||
startEditMode();
|
||||
//setButtonState();
|
||||
}
|
||||
|
||||
function saveTestState()
|
||||
{
|
||||
map2LevelData();
|
||||
setTestLevel(testLevelInfo);
|
||||
}
|
||||
|
||||
function startTestMode()
|
||||
{
|
||||
playMode = PLAY_TEST;
|
||||
playData = 3;
|
||||
|
||||
curLevel = testLevelInfo.level;
|
||||
stopEditTicker();
|
||||
saveTestState();
|
||||
canvasReSize();
|
||||
document.onkeydown = handleKeyDown; //key press
|
||||
selectIconObj.disable(1);
|
||||
initShowDataMsg();
|
||||
startGame();
|
||||
}
|
||||
|
||||
function getTestLevelMap(initValue)
|
||||
{
|
||||
return testLevelInfo.levelMap;
|
||||
}
|
||||
|
||||
var EDIT_PADDING = 1;
|
||||
|
||||
function canvasEditReSize()
|
||||
{
|
||||
for (var scale = MAX_SCALE; scale >= MIN_SCALE; scale -= 0.25) {
|
||||
canvasX = (BASE_SCREEN_X+BASE_TILE_X*2) * scale+ EDIT_PADDING * (NO_OF_TILES_X+1);
|
||||
canvasY = BASE_SCREEN_Y * scale + EDIT_PADDING * (NO_OF_TILES_Y+1);
|
||||
if (canvasX <= screenX && canvasY <= screenY || scale <= MIN_SCALE) break;
|
||||
}
|
||||
//debug("screenX = " + screenX + " screenY = " + screenY + "scale = " + scale);
|
||||
|
||||
canvas = document.getElementById('canvas');
|
||||
|
||||
canvas.width = canvasX;
|
||||
canvas.height = canvasY;
|
||||
|
||||
//Set canvas top left position
|
||||
var left = ((screenX - canvasX)/2|0),
|
||||
top = ((screenY - canvasY)/2|0);
|
||||
canvas.style.left = (left>0?left:0) + "px";
|
||||
canvas.style.top = (top>0?top:0) + "px";
|
||||
canvas.style.position = "absolute";
|
||||
|
||||
//initial constant value
|
||||
tileScale = scale;
|
||||
tileW = BASE_TILE_X * scale;
|
||||
tileH = BASE_TILE_Y * scale;
|
||||
|
||||
W2 = (tileW/2|0); //20, 15, 10,
|
||||
H2 = (tileH/2|0); //22, 16, 11
|
||||
|
||||
W4 = (tileW/4|0); //10, 7, 5,
|
||||
H4 = (tileH/4|0); //11, 8, 5,
|
||||
|
||||
editBorder = 4 * tileScale;
|
||||
}
|
||||
|
||||
function createBaseTile()
|
||||
{
|
||||
for(var id = 0; id < tileInfo.length; id++) {
|
||||
baseTile[id] = { image: preload.getResult(tileInfo[id][0]), id: id };
|
||||
}
|
||||
|
||||
emptyTile = { image: preload.getResult("empty"), id: 0 };
|
||||
actTile = baseTile[1];
|
||||
}
|
||||
|
||||
function createEditMap()
|
||||
{
|
||||
var tile, backColor, bitmap;
|
||||
|
||||
setEditBackground();
|
||||
drawEditArea(0,0,
|
||||
(tileW+EDIT_PADDING)*NO_OF_TILES_X+EDIT_PADDING,
|
||||
(tileH+EDIT_PADDING)*NO_OF_TILES_Y+EDIT_PADDING
|
||||
);
|
||||
|
||||
initMapInfo();
|
||||
getTestLevel(testLevelInfo);
|
||||
|
||||
|
||||
//(1) create empty map[x][y] array;
|
||||
editMap = [];
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
editMap[x] = [];
|
||||
}
|
||||
|
||||
//(2) draw map
|
||||
var index = 0;
|
||||
for(var y = 0; y < NO_OF_TILES_Y; y++) {
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
var id = tile2Id(testLevelInfo.levelMap.charAt(index++));
|
||||
tile = new createjs.Container();
|
||||
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("black").drawRect(0, 0, tileW, tileH).endFill();
|
||||
if(id == 0) {
|
||||
bitmap = new createjs.Bitmap(emptyTile.image);
|
||||
} else {
|
||||
bitmap = new createjs.Bitmap(baseTile[id].image);
|
||||
}
|
||||
bitmap.scaleX = bitmap.scaleY = tileScale;
|
||||
|
||||
tile.addChild(backColor, bitmap);
|
||||
tile.x = (tileW + EDIT_PADDING) * x+EDIT_PADDING;
|
||||
tile.y = (tileH + EDIT_PADDING) * y+EDIT_PADDING;
|
||||
editMap[x][y] = { tile: tile, id: id };
|
||||
mainStage.addChild(tile);
|
||||
addManCheck(id, x, y);
|
||||
}
|
||||
}
|
||||
drawEditGround();
|
||||
addSelectIcon();
|
||||
addCursorTile();
|
||||
drawEditLevel();
|
||||
drawSaveButton();
|
||||
drawTestButton();
|
||||
drawNewButton();
|
||||
enableTestButton();
|
||||
|
||||
mainStage.on("stagemouseup", stageMouseUp);
|
||||
mainStage.on("stagemousedown", stageMouseDown);
|
||||
}
|
||||
|
||||
function clearEditMap()
|
||||
{
|
||||
initMapInfo();
|
||||
for(var y = 0; y < NO_OF_TILES_Y; y++) {
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
var tileObj = editMap[x][y];
|
||||
tileObj.tile.getChildAt(1).image = emptyTile.image;
|
||||
tileObj.id = emptyTile.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var tileIdMapping = { ' ':0, '#':1, '@':2, 'H':3, '-':4, 'X':5, 'S':6, '$':7, '0':8, '&':9 };
|
||||
function tile2Id(tileChar)
|
||||
{
|
||||
if( tileIdMapping.hasOwnProperty(tileChar)) {
|
||||
return tileIdMapping[tileChar];
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function setEditBackground()
|
||||
{
|
||||
//set background color
|
||||
var background = new createjs.Shape();
|
||||
background.graphics.beginFill("black").drawRect(0, 0, canvas.width, canvas.height);
|
||||
mainStage.addChild(background);
|
||||
document.body.style.background = "#301050";
|
||||
}
|
||||
|
||||
function drawEditArea(startX, startY, width, height)
|
||||
{
|
||||
var editBack = new createjs.Shape();
|
||||
editBack.alpha = 0.5;
|
||||
editBack.graphics.beginFill("gold").drawRect(startX, startY, width, height);
|
||||
mainStage.addChild(editBack);
|
||||
}
|
||||
|
||||
function drawEditGround()
|
||||
{
|
||||
var groundTile;
|
||||
var y = (tileH + EDIT_PADDING) * NO_OF_TILES_Y+EDIT_PADDING;
|
||||
var x = (tileW + EDIT_PADDING) * NO_OF_TILES_X+EDIT_PADDING;
|
||||
|
||||
groundTile = new createjs.Shape();
|
||||
groundTile.graphics.beginFill("#0DA1FF").drawRect(0, 0, x, 10*tileScale);
|
||||
groundTile.x = 0;
|
||||
groundTile.y = y;
|
||||
|
||||
mainStage.addChild(groundTile);
|
||||
}
|
||||
|
||||
function addSelectIcon()
|
||||
{
|
||||
var x = (tileW+EDIT_PADDING)*NO_OF_TILES_X+tileW/2;
|
||||
var y;
|
||||
for(var i = 1; i < baseTile.length; i++) {
|
||||
y = (tileH*3/2)*(i-1) + tileH*3/2;
|
||||
drawSelectIcon(i, x, y);
|
||||
}
|
||||
y = (tileH*3/2)*(i-1) + tileH*3/2;
|
||||
drawSelectIcon(0, x, y);
|
||||
}
|
||||
|
||||
function addCursorTile()
|
||||
{
|
||||
var backColor, bitmap;
|
||||
|
||||
cursorTileObj = new createjs.Container();
|
||||
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("black").drawRect(0, 0, tileW, tileH).endFill();
|
||||
bitmap = new createjs.Bitmap(actTile.image);
|
||||
bitmap.scaleX = bitmap.scaleY = tileScale;
|
||||
|
||||
cursorTileObj.addChild(backColor, bitmap);
|
||||
cursorTileObj.alpha = 0;
|
||||
mainStage.addChild(cursorTileObj);
|
||||
|
||||
}
|
||||
|
||||
//var gameTicker = null; ....//same as playTicker
|
||||
function startEditTicker()
|
||||
{
|
||||
stopEditTicker();
|
||||
createjs.Ticker.setFPS(30);
|
||||
/*
|
||||
if(testLevelInfo.level >= MAX_EDIT_LEVEL) {
|
||||
mainStage.cursor = 'default';
|
||||
mainStage.update();
|
||||
return;
|
||||
}
|
||||
*/
|
||||
mainStage.enableMouseOver(120);
|
||||
gameTicker = createjs.Ticker.on("tick", editTick);
|
||||
}
|
||||
|
||||
function stopEditTicker()
|
||||
{
|
||||
if(gameTicker) {
|
||||
createjs.Ticker.off("tick", gameTicker);
|
||||
mainStage.enableMouseOver(0);
|
||||
mainStage.cursor = 'default';
|
||||
gameTicker = null;
|
||||
}
|
||||
}
|
||||
|
||||
function drawSelectIcon(id, x, y)
|
||||
{
|
||||
var tile, border, backColor, bitmap;
|
||||
var selColor;
|
||||
|
||||
tile = new createjs.Container();
|
||||
|
||||
//child id = 0
|
||||
border = new createjs.Shape();
|
||||
if(id == actTile.id) {
|
||||
selColor = "red";
|
||||
selectedTile = tile;
|
||||
} else {
|
||||
selColor = "black";
|
||||
}
|
||||
border.graphics.beginFill(selColor).drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
//child id = 1
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("black").drawRect(0, 0, tileW, tileH).endFill();
|
||||
|
||||
//child id = 2
|
||||
if(id == 0) {
|
||||
bitmap = new createjs.Bitmap(preload.getResult("eraser")); //id=2
|
||||
} else {
|
||||
bitmap = new createjs.Bitmap(baseTile[id].image); //id=2
|
||||
}
|
||||
bitmap.scaleX = bitmap.scaleY = tileScale;
|
||||
|
||||
tile.addChild(border, backColor, bitmap);
|
||||
|
||||
tile.x = x;
|
||||
tile.y = y;
|
||||
tile.myId = id;
|
||||
tile.on('click', selectTileClick);
|
||||
tile.on('mouseover', selectTileMouseOver);
|
||||
tile.on('mouseout', selectTileMouseOut);
|
||||
mainStage.addChild(tile);
|
||||
}
|
||||
|
||||
var mouseOver = 0;
|
||||
function selectTileClick()
|
||||
{
|
||||
var actBorder = this.getChildAt(0);
|
||||
var inActBorder = selectedTile.getChildAt(0);
|
||||
|
||||
inActBorder.graphics.clear();
|
||||
inActBorder.graphics.beginFill("black").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
actBorder.graphics.clear();
|
||||
actBorder.graphics.beginFill("red").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
actTile = baseTile[this.myId];
|
||||
cursorTileObj.getChildAt(1).image = actTile.image;
|
||||
selectedTile = this;
|
||||
}
|
||||
|
||||
function selectTileMouseOver()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mainStage.cursor = 'pointer'
|
||||
mouseOver = 1;
|
||||
}
|
||||
|
||||
function selectTileMouseOut()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
var color = (actTile.id == this.myId)?"red":"black";
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill(color).drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mouseOver = 0;
|
||||
}
|
||||
|
||||
function drawEditLevel()
|
||||
{
|
||||
var y = canvas.height - tileH - editBorder*2;
|
||||
|
||||
drawText(0, y, "LEVEL", mainStage);
|
||||
drawEditLevelNo();
|
||||
}
|
||||
|
||||
var editLevelNoObj = [];
|
||||
function drawEditLevelNo()
|
||||
{
|
||||
var y = canvas.height - tileH - editBorder*2;
|
||||
|
||||
for(var i = 0; i < editLevelNoObj.length; i++)
|
||||
mainStage.removeChild(editLevelNoObj[i]);
|
||||
|
||||
editLevelNoObj = drawText(5*tileW, y, ("00"+(testLevelInfo.level)).slice(-3), mainStage);
|
||||
}
|
||||
|
||||
var testButton, newButton, saveButton;
|
||||
|
||||
function drawTestButton()
|
||||
{
|
||||
var border, backColor, text;
|
||||
var textSting = "TEST";
|
||||
|
||||
var width = textSting.length * tileW;
|
||||
//var x = canvas.width - width * 1.5;
|
||||
var x = 20*(tileW+EDIT_PADDING)+EDIT_PADDING;
|
||||
var y = canvas.height - tileH - editBorder;
|
||||
|
||||
testButton = new createjs.Container();
|
||||
|
||||
//child id = 0
|
||||
border = new createjs.Shape();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
//child id = 1
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileH).endFill();
|
||||
|
||||
testButton.addChild(border, backColor);
|
||||
|
||||
//child id = 2
|
||||
drawText(0, 0, textSting, testButton);
|
||||
|
||||
testButton.x = x;
|
||||
testButton.y = y;
|
||||
testButton.on('click', testButtonClick);
|
||||
testButton.on('mouseover', testButtonMouseOver);
|
||||
testButton.on('mouseout', testButtonMouseOut);
|
||||
testButton.alpha = 0;
|
||||
mainStage.addChild(testButton);
|
||||
|
||||
function testButtonClick()
|
||||
{
|
||||
startTestMode();
|
||||
}
|
||||
|
||||
function testButtonMouseOver()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mainStage.cursor = 'pointer';
|
||||
mouseOver = 1;
|
||||
}
|
||||
|
||||
function testButtonMouseOut()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mouseOver = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function drawSaveButton()
|
||||
{
|
||||
var border, backColor, text;
|
||||
var textSting = "SAVE";
|
||||
|
||||
var width = textSting.length * tileW;
|
||||
//var x = canvas.width - width * 1.5;
|
||||
var x = 15*(tileW+EDIT_PADDING)+EDIT_PADDING;
|
||||
var y = canvas.height - tileH - editBorder;
|
||||
|
||||
saveButton = new createjs.Container();
|
||||
|
||||
//child id = 0
|
||||
border = new createjs.Shape();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
//child id = 1
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileH).endFill();
|
||||
|
||||
saveButton.addChild(border, backColor);
|
||||
|
||||
//child id = 2
|
||||
drawText(0, 0, textSting, saveButton);
|
||||
|
||||
saveButton.x = x;
|
||||
saveButton.y = y;
|
||||
saveButton.on('click', saveButtonClick);
|
||||
saveButton.on('mouseover', saveButtonMouseOver);
|
||||
saveButton.on('mouseout', saveButtonMouseOut);
|
||||
saveButton.alpha = 0;
|
||||
mainStage.addChild(saveButton);
|
||||
|
||||
function saveButtonClick()
|
||||
{
|
||||
stopEditTicker();
|
||||
saveEditLevel();
|
||||
yesNoDialog(["Save Successful", "Play It ?"], yesBitmap, noBitmap, mainStage, tileScale, playConfirm);
|
||||
|
||||
}
|
||||
|
||||
function saveButtonMouseOver()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mainStage.cursor = 'pointer';
|
||||
mouseOver = 1;
|
||||
}
|
||||
|
||||
function saveButtonMouseOut()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mouseOver = 0;
|
||||
}
|
||||
|
||||
function playConfirm(rc)
|
||||
{
|
||||
if(rc) { //yes
|
||||
clearTestLevel(); //clear current edit level
|
||||
startPlayUserLevel();
|
||||
} else { //no
|
||||
//enableTestButton();
|
||||
setButtonState();
|
||||
startEditTicker();
|
||||
}
|
||||
}
|
||||
|
||||
function startPlayUserLevel()
|
||||
{
|
||||
playMode = PLAY_MODERN;
|
||||
playData = 3;
|
||||
|
||||
curLevel = testLevelInfo.level;
|
||||
setModernInfo();
|
||||
|
||||
canvasReSize();
|
||||
document.onkeydown = handleKeyDown;
|
||||
initShowDataMsg();
|
||||
startGame();
|
||||
}
|
||||
}
|
||||
|
||||
function editLevelModified()
|
||||
{
|
||||
return (testLevelInfo.modified);
|
||||
}
|
||||
|
||||
function editConfirmAbortState(callbackFun)
|
||||
{
|
||||
stopEditTicker();
|
||||
yesNoDialog(["Abort current edit ?"], yesBitmap, noBitmap, mainStage, tileScale,
|
||||
function(rc) { if(rc) callbackFun(); else startEditTicker(); });
|
||||
}
|
||||
|
||||
function drawNewButton()
|
||||
{
|
||||
var border, backColor, text;
|
||||
var textSting = "NEW";
|
||||
var width = textSting.length * tileW;
|
||||
var x = 25*(tileW+EDIT_PADDING)+EDIT_PADDING;
|
||||
var y = canvas.height - tileH - editBorder;
|
||||
|
||||
newButton = new createjs.Container();
|
||||
|
||||
//child id = 0
|
||||
border = new createjs.Shape();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
//child id = 1
|
||||
backColor = new createjs.Shape();
|
||||
backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileH).endFill();
|
||||
|
||||
newButton.addChild(border, backColor);
|
||||
|
||||
//child id = 2
|
||||
drawText(0, 0, textSting, newButton);
|
||||
|
||||
newButton.x = x;
|
||||
newButton.y = y;
|
||||
newButton.on('click', newButtonClick);
|
||||
newButton.on('mouseover', newButtonMouseOver);
|
||||
newButton.on('mouseout', newButtonMouseOut);
|
||||
mainStage.addChild(newButton);
|
||||
|
||||
function newLevel(rc)
|
||||
{
|
||||
if(rc) {
|
||||
clearEditMap();
|
||||
if(testLevelInfo.level <= editLevels) { //edit exist level
|
||||
testLevelInfo.level = editLevels+1;
|
||||
drawEditLevelNo();
|
||||
}
|
||||
if(testLevelInfo.level > MAX_EDIT_LEVEL) {
|
||||
setButtonState();
|
||||
} else {
|
||||
disableTestButton();
|
||||
}
|
||||
clearTestLevel();
|
||||
}
|
||||
startEditTicker();
|
||||
}
|
||||
|
||||
function newButtonClick()
|
||||
{
|
||||
stopEditTicker();
|
||||
if(testLevelInfo.modified) {
|
||||
yesNoDialog(["Abort current edit ?"], yesBitmap, noBitmap, mainStage, tileScale, newLevel);
|
||||
} else {
|
||||
newLevel(1);
|
||||
}
|
||||
}
|
||||
|
||||
function newButtonMouseOver()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 3*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mainStage.cursor = 'pointer';
|
||||
mouseOver = 1;
|
||||
}
|
||||
|
||||
function newButtonMouseOut()
|
||||
{
|
||||
var border = this.getChildAt(0);
|
||||
|
||||
border.graphics.clear();
|
||||
border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 3*tileW+editBorder*2, tileH+editBorder*2).endFill();
|
||||
|
||||
mouseOver = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function setButtonState()
|
||||
{
|
||||
if(testLevelInfo.level > MAX_EDIT_LEVEL) {
|
||||
newButton.alpha = 0;
|
||||
testButton.alpha = 0;
|
||||
saveButton.alpha = 0;
|
||||
editWarningMsg(0);
|
||||
return;
|
||||
} else {
|
||||
newButton.alpha = 1;
|
||||
editWarningMsg(1);
|
||||
}
|
||||
|
||||
if(testLevelInfo.modified) {
|
||||
enableTestButton();
|
||||
if(testLevelInfo.pass) {
|
||||
saveButton.alpha = 1;
|
||||
} else {
|
||||
saveButton.alpha = 0;
|
||||
}
|
||||
} else {
|
||||
testLevelInfo.pass = 0;
|
||||
saveButton.alpha = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function enableTestButton()
|
||||
{
|
||||
if(lastRunner) testButton.alpha = 1;
|
||||
}
|
||||
|
||||
function disableTestButton()
|
||||
{
|
||||
testButton.alpha = 0;
|
||||
saveButton.alpha = 0;
|
||||
}
|
||||
|
||||
function clearUserLevelScore()
|
||||
{
|
||||
playData = 3;
|
||||
getModernScoreInfo();
|
||||
modernScoreInfo[testLevelInfo.level-1] = -1;
|
||||
setModernScoreInfo();
|
||||
}
|
||||
|
||||
function delUserLevelScore(level)
|
||||
{
|
||||
playData = 3;
|
||||
getModernScoreInfo();
|
||||
modernScoreInfo.splice(level-1, 1);
|
||||
modernScoreInfo[MAX_EDIT_LEVEL-1] = -1;
|
||||
setModernScoreInfo();
|
||||
}
|
||||
|
||||
function saveEditLevel()
|
||||
{
|
||||
map2LevelData();
|
||||
if(testLevelInfo.level > editLevels) { // new level
|
||||
addEditLevel(testLevelInfo.levelMap);
|
||||
} else {
|
||||
setEditLevel(testLevelInfo.level, testLevelInfo.levelMap);
|
||||
}
|
||||
clearUserLevelScore(); //clear score
|
||||
testLevelInfo.modified = 0;
|
||||
setEditSelectMenu();
|
||||
}
|
||||
|
||||
|
||||
var mouseDown = 0;
|
||||
var lastDown = {x:-1, y:-1};
|
||||
|
||||
function stageMouseDown(event)
|
||||
{
|
||||
mouseDown = 1;
|
||||
//console.log("DOWN");
|
||||
}
|
||||
|
||||
function stageMouseUp(event)
|
||||
{
|
||||
mouseDown = 0;
|
||||
lastDown = {x:-1, y:-1};
|
||||
//console.log("UP");
|
||||
}
|
||||
|
||||
function initMapInfo()
|
||||
{
|
||||
lastRunner = null;
|
||||
lastGuardList = [];
|
||||
|
||||
testLevelInfo.modified = 0;
|
||||
testLevelInfo.pass = 0;
|
||||
}
|
||||
|
||||
function addManCheck(id, x, y)
|
||||
{
|
||||
switch(id) {
|
||||
case RUNNER_ID:
|
||||
if (lastRunner && (lastRunner.x != x || lastRunner.y != y)) {
|
||||
var lastRunnerTile = editMap[lastRunner.x][lastRunner.y];
|
||||
lastRunnerTile.tile.getChildAt(1).image = emptyTile.image;
|
||||
lastRunnerTile.id = emptyTile.id;
|
||||
}
|
||||
lastRunner = { x:x, y:y };
|
||||
break;
|
||||
case GUARD_ID:
|
||||
var sameGuard=0, guardNo = lastGuardList.length;
|
||||
|
||||
for(var i = 0; i < guardNo; i++) {
|
||||
if(lastGuardList[i].x == x && lastGuardList[i].y == y) {
|
||||
sameGuard = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!sameGuard) {
|
||||
if(guardNo >= MAX_EDIT_GUARD) { //too many guards remove first one
|
||||
var x1 = lastGuardList[0].x, y1 = lastGuardList[0].y;
|
||||
var guardTile = editMap[x1][y1];
|
||||
|
||||
guardTile.tile.getChildAt(1).image = emptyTile.image;
|
||||
guardTile.id = emptyTile.id;
|
||||
lastGuardList.splice(0,1); //remove first one from array
|
||||
}
|
||||
lastGuardList.push({x:x, y:y});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function delManCheck(id, x, y)
|
||||
{
|
||||
switch(id) {
|
||||
case RUNNER_ID:
|
||||
//assert(lastRunner != null, "runner == null error");
|
||||
var lastRunnerTile = editMap[lastRunner.x][lastRunner.y];
|
||||
lastRunnerTile.tile.getChildAt(1).image = emptyTile.image;
|
||||
lastRunnerTile.id = emptyTile.id;
|
||||
lastRunner = null;
|
||||
disableTestButton();
|
||||
break;
|
||||
case GUARD_ID:
|
||||
var removeId = -1, guardNo = lastGuardList.length;
|
||||
|
||||
for(var i = 0; i < guardNo; i++) {
|
||||
if(lastGuardList[i].x == x && lastGuardList[i].y == y) {
|
||||
removeId = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(removeId >= 0) {
|
||||
var x1 = lastGuardList[removeId].x, y1 = lastGuardList[removeId].y;
|
||||
var guardTile = editMap[x1][y1];
|
||||
|
||||
guardTile.tile.getChildAt(1).image = emptyTile.image;
|
||||
guardTile.id = emptyTile.id;
|
||||
lastGuardList.splice(removeId,1);
|
||||
} else {
|
||||
console.log("design error !");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//state: = 0: no change, < 0: level deleted, > 0 level change to newLevel
|
||||
function editSelectMenuClose(levelDeleted, newLevel, state)
|
||||
{
|
||||
if(levelDeleted) {
|
||||
switch(true) {
|
||||
case (state > 0): //level changed
|
||||
getTestLevel(testLevelInfo);
|
||||
testLevelInfo.level = newLevel;
|
||||
setTestLevel(testLevelInfo);
|
||||
startEditMode();
|
||||
break;
|
||||
case (state < 0): //level deleted
|
||||
clearTestLevel();
|
||||
setEditSelectMenu();
|
||||
startEditMode();
|
||||
break;
|
||||
case (state == 0 && newLevel == 0): //new level
|
||||
if(testLevelInfo.modified == 1) {
|
||||
testLevelInfo.level = editLevels+1;
|
||||
setTestLevel(testLevelInfo);
|
||||
}
|
||||
startEditMode();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function editSelectLevel(level)
|
||||
{
|
||||
testLevelInfo.level = level;
|
||||
testLevelInfo.levelMap = editLevelData[level-1];
|
||||
setTestLevel(testLevelInfo);
|
||||
startEditMode();
|
||||
}
|
||||
|
||||
function map2LevelData()
|
||||
{
|
||||
var i=0;
|
||||
|
||||
testLevelInfo.levelMap = "";
|
||||
for(var y = 0; y < NO_OF_TILES_Y; y++) {
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
testLevelInfo.levelMap += tileInfo[editMap[x][y].id][1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================
|
||||
// Too many user created Levels
|
||||
//==============================
|
||||
var editWarningText = null;
|
||||
function editWarningMsg(hidden)
|
||||
{
|
||||
var x, y, width, height;
|
||||
|
||||
if(editWarningText == null)
|
||||
editWarningText = new createjs.Text("Too many user created levels !",
|
||||
"bold " + (64*tileScale) + "px Helvetica", "#fc5c1c");
|
||||
|
||||
width = editWarningText.getBounds().width;
|
||||
height = editWarningText.getBounds().height;
|
||||
x = editWarningText.x = (NO_OF_TILES_X*(tileW+EDIT_PADDING) - width) / 2 | 0;
|
||||
y = editWarningText.y = (NO_OF_TILES_Y*tileH - height) / 2 | 0;
|
||||
editWarningText.shadow = new createjs.Shadow("white", 2, 2, 1);
|
||||
|
||||
if(hidden) {
|
||||
mainStage.removeChild(editWarningText);
|
||||
} else {
|
||||
mainStage.addChild(editWarningText);
|
||||
}
|
||||
mainStage.update();
|
||||
}
|
||||
|
||||
var copyLevelMap = null;
|
||||
function editHandleKeyDown(event)
|
||||
{
|
||||
if(!event){ event = window.event; } //cross browser issues exist
|
||||
|
||||
if (event.ctrlKey) {
|
||||
if(event.keyCode == KEYCODE_V) { //CTRL-V
|
||||
if(copyLevelMap != null) {
|
||||
testLevelInfo.levelMap = copyLevelMap;
|
||||
testLevelInfo.pass = 1;
|
||||
setTestLevel(testLevelInfo);
|
||||
startEditMode();
|
||||
////setButtonState();
|
||||
setTimeout(function() { showTipsText("PASTE MAP", 0);}, 50);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function editTick()
|
||||
{
|
||||
var x = ((mainStage.mouseX-EDIT_PADDING) / (tileW+EDIT_PADDING) )| 0;
|
||||
var y = ((mainStage.mouseY-EDIT_PADDING) / (tileH+EDIT_PADDING) )| 0;
|
||||
|
||||
if(testLevelInfo.level > MAX_EDIT_LEVEL) {
|
||||
mainStage.cursor = 'default';
|
||||
mainStage.update();
|
||||
return;
|
||||
}
|
||||
if(x >= 0 && x < NO_OF_TILES_X && y >= 0 && y < NO_OF_TILES_Y) {
|
||||
//edit area
|
||||
mainStage.cursor = 'pointer';
|
||||
if( x != lastDown.x || y != lastDown.y) {
|
||||
cursorTileObj.alpha = 1;
|
||||
cursorTileObj.x = (tileW + EDIT_PADDING) * x+EDIT_PADDING;
|
||||
cursorTileObj.y = (tileH + EDIT_PADDING) * y+EDIT_PADDING;
|
||||
if(mouseDown) {
|
||||
var clickTile = editMap[x][y];
|
||||
|
||||
if(!actTile.id || clickTile.id == actTile.id) {
|
||||
if(actTile.id) cursorTileObj.alpha = 0;
|
||||
delManCheck(clickTile.id, x, y);
|
||||
clickTile.tile.getChildAt(1).image = emptyTile.image;
|
||||
clickTile.id = emptyTile.id;
|
||||
} else {
|
||||
delManCheck(clickTile.id, x, y);
|
||||
clickTile.tile.getChildAt(1).image = actTile.image;
|
||||
clickTile.id = actTile.id;
|
||||
addManCheck(actTile.id, x, y);
|
||||
}
|
||||
lastDown = {x:x, y:y};
|
||||
|
||||
if(testLevelInfo.pass || actTile.id == RUNNER_ID || testLevelInfo.modified == 0) {
|
||||
testLevelInfo.modified = 1;
|
||||
testLevelInfo.pass = 0;
|
||||
setButtonState();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(!mouseOver) mainStage.cursor = 'default';
|
||||
cursorTileObj.alpha = 0;
|
||||
}
|
||||
mainStage.update();
|
||||
}
|
||||
@@ -0,0 +1,756 @@
|
||||
//=============================================================================
|
||||
// AI reference book: "玩 Lode Runner 學 C 語言"
|
||||
// http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538
|
||||
//=============================================================================
|
||||
|
||||
var movePolicy = [ [0, 0, 0], //* move_map is used to find *//
|
||||
[0, 1, 1], //* wheather to move a enm *//
|
||||
[1, 1, 1], //* by indexing into it with *//
|
||||
[1, 2, 1], //* enm_byte + num_enm + *//
|
||||
[1, 2, 2], //* set_num to get a byte. *//
|
||||
[2, 2, 2], //* then that byte is checked*//
|
||||
[2, 2, 3], //* for !=0 and then decrmnt *//
|
||||
[2, 3, 3], //* for next test until = 0 *//
|
||||
[3, 3, 3],
|
||||
[3, 3, 4],
|
||||
[3, 4, 4],
|
||||
[4, 4, 4]
|
||||
];
|
||||
|
||||
var moveOffset = 0;
|
||||
var moveId = 0; //current guard id
|
||||
|
||||
//********************************
|
||||
//initial guard start move value
|
||||
//********************************
|
||||
function initGuardVariable()
|
||||
{
|
||||
moveOffset = moveId = 0;
|
||||
}
|
||||
|
||||
function moveGuard()
|
||||
{
|
||||
var moves;
|
||||
var curGuard;
|
||||
var x, y, yOffset;
|
||||
|
||||
if(!guardCount) return; //no guard
|
||||
|
||||
if( ++moveOffset >= 3 ) moveOffset = 0;
|
||||
moves = movePolicy[guardCount][moveOffset]; // get next moves
|
||||
|
||||
while ( moves-- > 0) { // slows guard relative to runner
|
||||
if(++moveId >= guardCount) moveId = 0;
|
||||
curGuard = guard[moveId];
|
||||
|
||||
if(curGuard.action == ACT_IN_HOLE || curGuard.action == ACT_REBORN) {
|
||||
continue;
|
||||
}
|
||||
|
||||
guardMoveStep(moveId, bestMove(moveId));
|
||||
}
|
||||
}
|
||||
|
||||
function guardMoveStep( id, action)
|
||||
{
|
||||
var curGuard = guard[id];
|
||||
var x = curGuard.pos.x;
|
||||
var xOffset = curGuard.pos.xOffset;
|
||||
var y = curGuard.pos.y;
|
||||
var yOffset = curGuard.pos.yOffset;
|
||||
|
||||
var curToken, nextToken;
|
||||
var centerX, centerY;
|
||||
var curShape, newShape;
|
||||
var stayCurrPos;
|
||||
|
||||
centerX = centerY = ACT_STOP;
|
||||
curShape = newShape = curGuard.shape;
|
||||
|
||||
if(curGuard.action == ACT_CLIMB_OUT && action == ACT_STOP)
|
||||
curGuard.action = ACT_STOP; //for level 16, 30, guard will stock in hole
|
||||
|
||||
switch(action) {
|
||||
case ACT_UP:
|
||||
case ACT_DOWN:
|
||||
case ACT_FALL:
|
||||
if ( action == ACT_UP ) {
|
||||
stayCurrPos = ( y <= 0 ||
|
||||
(nextToken = map[x][y-1].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T ||
|
||||
nextToken == GUARD_T);
|
||||
|
||||
if( yOffset <= 0 && stayCurrPos)
|
||||
action = ACT_STOP;
|
||||
} else { //ACT_DOWN || ACT_FALL
|
||||
stayCurrPos = ( y >= maxTileY ||
|
||||
(nextToken = map[x][y+1].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == GUARD_T);
|
||||
|
||||
if( action == ACT_FALL && yOffset < 0 && map[x][y].base == BLOCK_T) {
|
||||
action = ACT_IN_HOLE;
|
||||
stayCurrPos = 1;
|
||||
} else {
|
||||
if ( yOffset >= 0 && stayCurrPos)
|
||||
action = ACT_STOP;
|
||||
}
|
||||
}
|
||||
|
||||
if ( action != ACT_STOP ) {
|
||||
if ( xOffset > 0)
|
||||
centerX = ACT_LEFT;
|
||||
else if ( xOffset < 0)
|
||||
centerX = ACT_RIGHT;
|
||||
}
|
||||
break;
|
||||
case ACT_LEFT:
|
||||
case ACT_RIGHT:
|
||||
if ( action == ACT_LEFT ) {
|
||||
/* original source code from book
|
||||
stayCurrPos = ( x <= 0 ||
|
||||
(nextToken = map[x-1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T ||
|
||||
nextToken == GUARD_T);
|
||||
*/
|
||||
// change check TRAP_T from base,
|
||||
// for support level 41==> runner in trap will cause guard move
|
||||
stayCurrPos = ( x <= 0 ||
|
||||
(nextToken = map[x-1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == GUARD_T ||
|
||||
map[x-1][y].base == TRAP_T);
|
||||
|
||||
if (xOffset <= 0 && stayCurrPos)
|
||||
action = ACT_STOP;
|
||||
} else { //ACT_RIGHT
|
||||
/* original source code from book
|
||||
stayCurrPos = ( x >= maxTileX ||
|
||||
(nextToken = map[x+1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T ||
|
||||
nextToken == GUARD_T);
|
||||
*/
|
||||
// change check TRAP_T from base,
|
||||
// for support level 41==> runner in trap will cause guard move
|
||||
stayCurrPos = ( x >= maxTileX ||
|
||||
(nextToken = map[x+1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == GUARD_T ||
|
||||
map[x+1][y].base == TRAP_T);
|
||||
|
||||
if (xOffset >= 0 && stayCurrPos)
|
||||
action = ACT_STOP;
|
||||
}
|
||||
|
||||
if ( action != ACT_STOP ) {
|
||||
if ( yOffset > 0 )
|
||||
centerY = ACT_UP;
|
||||
else if ( yOffset < 0)
|
||||
centerY = ACT_DOWN;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
curToken = map[x][y].base;
|
||||
|
||||
if ( action == ACT_UP ) {
|
||||
yOffset -= yMove;
|
||||
|
||||
if(stayCurrPos && yOffset < 0) yOffset = 0; //stay on current position
|
||||
else if(yOffset < -H2) { //move to y-1 position
|
||||
if ( curToken == BLOCK_T || curToken == HLADR_T ) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x][y-1], so set [x][y].act to previous state
|
||||
y--;
|
||||
yOffset = tileH + yOffset;
|
||||
if(map[x][y].act == RUNNER_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
//map[x][y].act = GUARD_T;
|
||||
}
|
||||
|
||||
if( yOffset <= 0 && yOffset > -yMove) {
|
||||
dropGold(id); //decrease count
|
||||
}
|
||||
newShape = "runUpDn";
|
||||
}
|
||||
|
||||
if ( centerY == ACT_UP ) {
|
||||
yOffset -= yMove;
|
||||
if( yOffset < 0) yOffset = 0; //move to center Y
|
||||
}
|
||||
|
||||
if ( action == ACT_DOWN || action == ACT_FALL || action == ACT_IN_HOLE) {
|
||||
var holdOnBar = 0;
|
||||
if(curToken == BAR_T) {
|
||||
if( yOffset < 0) holdOnBar = 1;
|
||||
else if(action == ACT_DOWN && y < maxTileY && map[x][y+1].act != LADDR_T) {
|
||||
action = ACT_FALL; //shape fixed: 2014/03/27
|
||||
}
|
||||
}
|
||||
|
||||
yOffset += yMove;
|
||||
|
||||
if(holdOnBar == 1 && yOffset >= 0) {
|
||||
yOffset = 0; //fall and hold on bar
|
||||
action = ACT_FALL_BAR;
|
||||
}
|
||||
if(stayCurrPos && yOffset > 0 ) yOffset = 0; //stay on current position
|
||||
else if(yOffset > H2) { //move to y+1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x][y+1], so set [x][y].act to previous state
|
||||
y++;
|
||||
yOffset = yOffset - tileH;
|
||||
if(map[x][y].act == RUNNER_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
//map[x][y].act = GUARD_T;
|
||||
}
|
||||
if(action == ACT_DOWN && yOffset >= 0 && yOffset < yMove) { //try drop gold
|
||||
dropGold(id); //decrease count
|
||||
}
|
||||
|
||||
if(action == ACT_IN_HOLE) { //check in hole or still falling
|
||||
if (yOffset < 0) action = ACT_FALL; //still falling
|
||||
else { //fall into hole (yOffset MUST = 0)
|
||||
if( curGuard.hasGold > 0 ) {
|
||||
if(map[x][y-1].base == EMPTY_T) {
|
||||
//drop gold above
|
||||
addGold(x, y-1);
|
||||
} else
|
||||
decGold(); //gold disappear
|
||||
}
|
||||
curGuard.hasGold = 0;
|
||||
curGuard.sprite.on("animationend", function() { climbOut(id); });
|
||||
soundPlay("trap");
|
||||
if( curShape == "fallRight") newShape = "shakeRight";
|
||||
else newShape = "shakeLeft";
|
||||
if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) {
|
||||
drawScore(SCORE_IN_HOLE);
|
||||
} else {
|
||||
//for modem mode & edit mode
|
||||
//drawGuard(1); //only guard dead need add count
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(action == ACT_DOWN) {
|
||||
newShape = "runUpDn";
|
||||
} else { //ACT_FALL or ACT_FALL_BAR
|
||||
if (action == ACT_FALL_BAR) {
|
||||
if(curGuard.lastLeftRight == ACT_LEFT) newShape = "barLeft";
|
||||
else newShape = "barRight";
|
||||
} else {
|
||||
if(action == ACT_FALL && curShape != "fallLeft" && curShape != "fallRight") {
|
||||
if (curGuard.lastLeftRight == ACT_LEFT) newShape = "fallLeft";
|
||||
else newShape = "fallRight";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( centerY == ACT_DOWN ) {
|
||||
yOffset += yMove;
|
||||
if ( yOffset > 0 ) yOffset = 0; //move to center Y
|
||||
}
|
||||
|
||||
if ( action == ACT_LEFT) {
|
||||
xOffset -= xMove;
|
||||
|
||||
if(stayCurrPos && xOffset < 0) xOffset = 0; //stay on current position
|
||||
else if ( xOffset < -W2) { //move to x-1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x-1][y], so set [x][y].act to previous state
|
||||
x--;
|
||||
xOffset = tileW + xOffset;
|
||||
if(map[x][y].act == RUNNER_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
//map[x][y].act = GUARD_T;
|
||||
}
|
||||
if( xOffset <= 0 && xOffset > -xMove) {
|
||||
dropGold(id); //try to drop gold
|
||||
}
|
||||
if(curToken == BAR_T) newShape = "barLeft";
|
||||
else newShape = "runLeft";
|
||||
}
|
||||
|
||||
if ( centerX == ACT_LEFT ) {
|
||||
xOffset -= xMove;
|
||||
if ( xOffset < 0) xOffset = 0; //move to center X
|
||||
}
|
||||
|
||||
if ( action == ACT_RIGHT ) {
|
||||
xOffset += xMove;
|
||||
|
||||
if(stayCurrPos && xOffset > 0) xOffset = 0; //stay on current position
|
||||
else if ( xOffset > W2) { //move to x+1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x+1][y], so set [x][y].act to previous state
|
||||
x++;
|
||||
xOffset = xOffset - tileW;
|
||||
if(map[x][y].act == RUNNER_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
//map[x][y].act = GUARD_T;
|
||||
}
|
||||
if( xOffset >= 0 && xOffset < xMove) {
|
||||
dropGold(id);
|
||||
}
|
||||
if(curToken == BAR_T) newShape = "barRight";
|
||||
else newShape = "runRight";
|
||||
}
|
||||
|
||||
if ( centerX == ACT_RIGHT ) {
|
||||
xOffset += xMove;
|
||||
if ( xOffset > 0) xOffset = 0; //move to center X
|
||||
}
|
||||
|
||||
//if(curGuard == ACT_CLIMB_OUT) action == ACT_CLIMB_OUT;
|
||||
|
||||
if(action == ACT_STOP) {
|
||||
if(curGuard.action != ACT_STOP){
|
||||
curGuard.sprite.stop();
|
||||
if(curGuard.action != ACT_CLIMB_OUT) curGuard.action = ACT_STOP;
|
||||
}
|
||||
} else {
|
||||
if(curGuard.action == ACT_CLIMB_OUT) action = ACT_CLIMB_OUT;
|
||||
curGuard.sprite.x = x * tileW + xOffset;
|
||||
curGuard.sprite.y = y * tileH + yOffset;
|
||||
curGuard.pos = { x:x, y:y, xOffset:xOffset, yOffset:yOffset};
|
||||
if(curShape != newShape) {
|
||||
curGuard.sprite.gotoAndPlay(newShape);
|
||||
curGuard.shape = newShape;
|
||||
}
|
||||
if(action != curGuard.action){
|
||||
curGuard.sprite.play();
|
||||
}
|
||||
curGuard.action = action;
|
||||
if(action == ACT_LEFT || action == ACT_RIGHT) curGuard.lastLeftRight = action;
|
||||
}
|
||||
map[x][y].act = GUARD_T;
|
||||
|
||||
// Check to get gold and carry
|
||||
if(map[x][y].base == GOLD_T && curGuard.hasGold == 0 &&
|
||||
((!xOffset && yOffset >= 0 && yOffset < H4) ||
|
||||
(!yOffset && xOffset >= 0 && xOffset < W4) ||
|
||||
(y < maxTileY && map[x][y+1].base == LADDR_T && yOffset < H4) // gold above laddr
|
||||
)
|
||||
)
|
||||
{
|
||||
curGuard.hasGold = ((Math.random()*26)+14)|0; //14 - 39
|
||||
if(playMode == PLAY_AUTO || playMode == PLAY_DEMO) getDemoGold(curGuard);
|
||||
if(recordMode) processRecordGold(curGuard);
|
||||
removeGold(x, y);
|
||||
//debug ("get, (x,y) = " + x + "," + y + ", offset = " + xOffset);
|
||||
}
|
||||
|
||||
//check collision again
|
||||
//checkCollision(runner.pos.x, runner.pos.y);
|
||||
}
|
||||
|
||||
function dropGold(id)
|
||||
{
|
||||
var curGuard = guard[id];
|
||||
var nextToken;
|
||||
var drop = 0;
|
||||
|
||||
switch (true) {
|
||||
case (curGuard.hasGold > 1):
|
||||
curGuard.hasGold--; // count > 1, don't drop it only decrease count
|
||||
//loadingTxt.text = "(" + id + ") = " + curGuard.hasGold;
|
||||
break;
|
||||
case (curGuard.hasGold == 1):
|
||||
var x = curGuard.pos.x, y = curGuard.pos.y;
|
||||
|
||||
if(map[x][y].base == EMPTY_T && ( y >= maxTileY ||
|
||||
((nextToken = map[x][y+1].base) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == LADDR_T) )
|
||||
) {
|
||||
addGold(x,y);
|
||||
curGuard.hasGold = -1; //for record play action always use value = -1
|
||||
//curGuard.hasGold = -(((Math.random()*10)+1)|0); //-1 ~ -10; //waiting time for get gold
|
||||
drop = 1;
|
||||
}
|
||||
break;
|
||||
case (curGuard.hasGold < 0):
|
||||
curGuard.hasGold++; //wait, don't get gold till count = 0
|
||||
//loadingTxt.text = "(" + id + ") = " + curGuard.hasGold;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function climbOut(id)
|
||||
{
|
||||
var curGuard = guard[id]
|
||||
|
||||
curGuard.action = ACT_CLIMB_OUT;
|
||||
curGuard.sprite.removeAllEventListeners ("animationend");
|
||||
curGuard.sprite.gotoAndPlay("runUpDn");
|
||||
curGuard.shape = "runUpDn";
|
||||
curGuard.holePos = {x: curGuard.pos.x, y: curGuard.pos.y };
|
||||
}
|
||||
|
||||
function bestMove(id)
|
||||
{
|
||||
var guarder = guard[id];
|
||||
var x = guarder.pos.x;
|
||||
var xOffset = guarder.pos.xOffset;
|
||||
var y = guarder.pos.y;
|
||||
var yOffset = guarder.pos.yOffset;
|
||||
|
||||
var curToken, nextBelow, nextMove;
|
||||
var checkSameLevelOnly = 0;
|
||||
|
||||
curToken = map[x][y].base;
|
||||
|
||||
if(guarder.action == ACT_CLIMB_OUT) { //clib from hole
|
||||
if(guarder.pos.y == guarder.holePos.y) {
|
||||
return (ACT_UP);
|
||||
}else {
|
||||
checkSameLevelOnly = 1;
|
||||
if(guarder.pos.x != guarder.holePos.x) { //out of hole
|
||||
guarder.action = ACT_LEFT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !checkSameLevelOnly) {
|
||||
|
||||
/****** next check to see if enm must fall. if so ***********/
|
||||
/****** return e_fall and skip the rest. ***********/
|
||||
|
||||
if ( curToken == LADDR_T || (curToken == BAR_T && yOffset === 0) ) { //ladder & bar
|
||||
/* no guard fall */
|
||||
} else if ( yOffset < 0) //no laddr & yOffset < 0 ==> falling
|
||||
return (ACT_FALL);
|
||||
else if ( y < maxTileY )
|
||||
{
|
||||
nextBelow = map[x][y+1].act;
|
||||
|
||||
if ( (nextBelow == EMPTY_T || nextBelow == RUNNER_T )) {
|
||||
return (ACT_FALL);
|
||||
} else if ( nextBelow == BLOCK_T || nextBelow == SOLID_T ||
|
||||
nextBelow == GUARD_T || nextBelow == LADDR_T ) {
|
||||
/* no guard fall */
|
||||
} else {
|
||||
return ( ACT_FALL );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******* next check to see if palyer on same floor *********/
|
||||
/******* and whether enm can get him. Ignore walls *********/
|
||||
var runnerX = runner.pos.x;
|
||||
var runnerY = runner.pos.y;
|
||||
|
||||
// if ( y == runnerY ) { // same floor with runner
|
||||
if ( y == runnerY && runner.action != ACT_FALL) { //case : guard on laddr and falling => don't catch it
|
||||
while ( x != runnerX ) {
|
||||
if ( y < maxTileY )
|
||||
nextBelow = map[x][y+1].base;
|
||||
else nextBelow = SOLID_T;
|
||||
|
||||
curToken = map[x][y].base;
|
||||
|
||||
if ( curToken == LADDR_T || curToken == BAR_T || // go through
|
||||
nextBelow == SOLID_T || nextBelow == LADDR_T ||
|
||||
nextBelow == BLOCK_T || map[x][y+1].act == GUARD_T || //fixed: must check map[].act with guard_t (for support champLevel:43)
|
||||
nextBelow == BAR_T || nextBelow == GOLD_T) //add BAR_T & GOLD_T for support level 92
|
||||
{
|
||||
if ( x < runnerX) // guard left to runner
|
||||
++x;
|
||||
else if ( x > runnerX )
|
||||
--x; // guard right to runner
|
||||
} else break; // exit loop with closest x if no path to runner
|
||||
}
|
||||
|
||||
if ( x == runnerX ) // scan for a path ignoring walls is a success
|
||||
{
|
||||
if (guarder.pos.x < runnerX ) { //if left of man go right else left
|
||||
nextMove = ACT_RIGHT;
|
||||
} else if ( guarder.pos.x > runnerX ) {
|
||||
nextMove = ACT_LEFT;
|
||||
} else { // guard X = runner X
|
||||
if ( guarder.pos.xOffset < runner.pos.xOffset )
|
||||
nextMove = ACT_RIGHT;
|
||||
else
|
||||
nextMove = ACT_LEFT;
|
||||
}
|
||||
return (nextMove);
|
||||
}
|
||||
} // if ( y == runnerY ) { ...
|
||||
|
||||
/********** If can't reach man on current level, then scan floor *********/
|
||||
/********** (ignoring walls) and look up and down for best move *********/
|
||||
|
||||
return scanFloor(id);
|
||||
}
|
||||
|
||||
var bestPath, bestRating, curRating;
|
||||
var leftEnd, rightEnd;
|
||||
var startX, startY;
|
||||
|
||||
function scanFloor(id)
|
||||
{
|
||||
var x, y;
|
||||
var curToken, nextBelow;
|
||||
var curPath;
|
||||
|
||||
x = startX = guard[id].pos.x;
|
||||
y = startY = guard[id].pos.y;
|
||||
|
||||
bestRating = 255; // start with worst rating
|
||||
curRating = 255;
|
||||
bestPath = ACT_STOP;
|
||||
|
||||
/****** get ends for search along floor ******/
|
||||
|
||||
while ( x > 0 ) { //get left end first
|
||||
curToken = map[x-1][y].act;
|
||||
if ( curToken == BLOCK_T || curToken == SOLID_T )
|
||||
break;
|
||||
if ( curToken == LADDR_T || curToken == BAR_T || y >= maxTileY ||
|
||||
y < maxTileY && ( ( nextBelow = map[x-1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == SOLID_T || nextBelow == LADDR_T ) )
|
||||
--x;
|
||||
else {
|
||||
--x; // go on left anyway
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
leftEnd = x;
|
||||
x = startX;
|
||||
while ( x < maxTileX ) { // get right end next
|
||||
curToken = map[x+1][y].act;
|
||||
if ( curToken == BLOCK_T || curToken == SOLID_T )
|
||||
break;
|
||||
|
||||
if ( curToken == LADDR_T || curToken == BAR_T || y >= maxTileY ||
|
||||
y < maxTileY && ( ( nextBelow = map[x+1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == SOLID_T || nextBelow == LADDR_T ) )
|
||||
++x;
|
||||
else { // go on right anyway
|
||||
++x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rightEnd = x;
|
||||
|
||||
/******* Do middle scan first for best rating and direction *******/
|
||||
|
||||
x = startX;
|
||||
if ( y < maxTileY &&
|
||||
(nextBelow = map[x][y+1].base) != BLOCK_T && nextBelow != SOLID_T )
|
||||
scanDown( x, ACT_DOWN );
|
||||
|
||||
if( map[x][y].base == LADDR_T )
|
||||
scanUp( x, ACT_UP );
|
||||
|
||||
/******* next scan both sides of floor for best rating *******/
|
||||
|
||||
curPath = ACT_LEFT;
|
||||
x = leftEnd;
|
||||
|
||||
while ( true ) {
|
||||
if ( x == startX ) {
|
||||
if ( curPath == ACT_LEFT && rightEnd != startX ) {
|
||||
curPath = ACT_RIGHT;
|
||||
x = rightEnd;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
if( y < maxTileY &&
|
||||
(nextBelow = map [x][y+1].base) != BLOCK_T && nextBelow != SOLID_T )
|
||||
scanDown (x, curPath );
|
||||
|
||||
if( map[x][y].base == LADDR_T )
|
||||
scanUp ( x, curPath );
|
||||
|
||||
if ( curPath == ACT_LEFT )
|
||||
x++;
|
||||
else x--;
|
||||
}
|
||||
|
||||
|
||||
return ( bestPath );
|
||||
} // end scan floor for best direction to go
|
||||
|
||||
function scanDown(x, curPath )
|
||||
{
|
||||
var y;
|
||||
var nextBelow; //curRating;
|
||||
var runnerX = runner.pos.x;
|
||||
var runnerY = runner.pos.y;
|
||||
|
||||
y = startY;
|
||||
|
||||
while( y < maxTileY && ( nextBelow = map [x][y+1].base) != BLOCK_T &&
|
||||
nextBelow != SOLID_T ) // while no floor below ==> can move down
|
||||
{
|
||||
if ( map[x][y].base != EMPTY_T && map[x][y].base != HLADR_T) { // if not falling ==> try move left or right
|
||||
//************************************************************************************
|
||||
// 2014/04/14 Add check "map[x][y].base != HLADR_T" for support
|
||||
// champLevel 19: a guard in hole with h-ladder can run left after dig the left hole
|
||||
//************************************************************************************
|
||||
if ( x > 0 ) { // if not at left edge check left side
|
||||
if ( (nextBelow = map[x-1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == LADDR_T || nextBelow == SOLID_T ||
|
||||
map[x-1][y].base == BAR_T ) // can move left
|
||||
{
|
||||
if ( y >= runnerY ) // no need to go on
|
||||
break; // already below runner
|
||||
}
|
||||
}
|
||||
|
||||
if ( x < maxTileX ) // if not at right edge check right side
|
||||
{
|
||||
if ( (nextBelow = map[x+1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == LADDR_T || nextBelow == SOLID_T ||
|
||||
map[x+1][y].base == BAR_T ) // can move right
|
||||
{
|
||||
if ( y >= runnerY )
|
||||
break;
|
||||
}
|
||||
}
|
||||
} // end if not falling
|
||||
++y; // go to next level down
|
||||
} // end while ( y < maxTileY ... ) scan down
|
||||
|
||||
if( y == runnerY ) { // update best rating and direct.
|
||||
curRating = Math.abs(startX - x);
|
||||
// if ( (curRating = runnerX - x) < 0) //BUG from original book ? (changed by Simon)
|
||||
// curRating = -curRating; //ABS
|
||||
} else if ( y > runnerY )
|
||||
curRating = y - runnerY + 200; // position below runner
|
||||
else curRating = runnerY - y + 100; // position above runner
|
||||
|
||||
if( curRating < bestRating )
|
||||
{
|
||||
bestRating = curRating;
|
||||
bestPath = curPath;
|
||||
}
|
||||
|
||||
} // end Scan Down
|
||||
|
||||
function scanUp( x, curPath )
|
||||
{
|
||||
var y;
|
||||
var nextBelow; //curRating;
|
||||
var runnerX = runner.pos.x;
|
||||
var runnerY = runner.pos.y;
|
||||
|
||||
y = startY;
|
||||
|
||||
while ( y > 0 && map[x][y].base == LADDR_T ) { // while can go up
|
||||
--y;
|
||||
if ( x > 0 ) { // if not at left edge check left side
|
||||
if ( (nextBelow = map[x-1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == SOLID_T || nextBelow == LADDR_T ||
|
||||
map[x-1][y].base == BAR_T ) // can move left
|
||||
{
|
||||
if ( y <= runnerY ) // no need to go on
|
||||
break; // already above runner
|
||||
}
|
||||
}
|
||||
|
||||
if ( x < maxTileX ) { // if not at right edge check right side
|
||||
if ( (nextBelow = map[x+1][y+1].base) == BLOCK_T ||
|
||||
nextBelow == SOLID_T || nextBelow == LADDR_T ||
|
||||
map[x+1][y].base == BAR_T ) // can move right
|
||||
{
|
||||
if ( y <= runnerY )
|
||||
break;
|
||||
}
|
||||
}
|
||||
//--y;
|
||||
} // end while ( y > 0 && laddr up) scan up
|
||||
|
||||
if ( y == runnerY ) { // update best rating and direct.
|
||||
curRating = Math.abs(startX - x);
|
||||
//if ( (curRating = runnerX - x) < 0) // BUG from original book ? (changed by Simon)
|
||||
// curRating = -curRating; //ABS
|
||||
} else if ( y > runnerY )
|
||||
curRating = y - runnerY + 200; // position below runner
|
||||
else curRating = runnerY - y + 100; // position above runner
|
||||
|
||||
if ( curRating < bestRating )
|
||||
{
|
||||
bestRating = curRating;
|
||||
bestPath = curPath;
|
||||
}
|
||||
|
||||
} // end scan Up
|
||||
|
||||
var bornRndX; //range random 0..maxTileX
|
||||
|
||||
function initRnd()
|
||||
{
|
||||
//bornRndX = new rangeRandom(0, maxTileX, curLevel); //set fixed seed for demo mode
|
||||
bornRndX = new rangeRandom(0, maxTileX, 0); //random range 0 .. maxTileX
|
||||
}
|
||||
|
||||
function getGuardId(x, y)
|
||||
{
|
||||
var id;
|
||||
|
||||
for(id = 0; id < guardCount; id++) {
|
||||
if ( guard[id].pos.x == x && guard[id].pos.y == y) break;
|
||||
}
|
||||
assert(id < guardCount, "Error: can not get guard position!");
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
function guardReborn(x, y)
|
||||
{
|
||||
var id;
|
||||
|
||||
//get guard id by current in hole position
|
||||
id = getGuardId(x, y);
|
||||
|
||||
var bornY = 1; //start on line 2
|
||||
var bornX = bornRndX.get();
|
||||
var rndStart = bornX;
|
||||
|
||||
while(map[bornX][bornY].act != EMPTY_T) { //BUG FIXED for level 115 (can not reborn at bornX=27)
|
||||
if( (bornX = bornRndX.get()) == rndStart) {
|
||||
bornY++;
|
||||
}
|
||||
assert(bornY <= maxTileY, "Error: Born Y too large !");
|
||||
}
|
||||
//debug("bornX = " + bornX);
|
||||
if(playMode == PLAY_AUTO || playMode == PLAY_DEMO) {
|
||||
var bornPos = getDemoBornPos();
|
||||
bornX = bornPos.x;
|
||||
bornY = bornPos.y;
|
||||
}
|
||||
|
||||
if(recordMode == RECORD_KEY) saveRecordBornPos(bornX, bornY);
|
||||
else if(recordMode == RECORD_PLAY) {
|
||||
var bornPos = getRecordBornPos();
|
||||
bornX = bornPos.x;
|
||||
bornY = bornPos.y;
|
||||
}
|
||||
|
||||
map[bornX][bornY].act = GUARD_T;
|
||||
//debug("born (x,y) = (" + bornX + "," + bornY + ")");
|
||||
|
||||
var curGuard = guard[id];
|
||||
|
||||
curGuard.pos = { x:bornX, y:bornY, xOffset:0, yOffset: 0 };
|
||||
curGuard.sprite.x = bornX * tileW;
|
||||
curGuard.sprite.y = bornY * tileH;
|
||||
curGuard.sprite.on("animationend", function() { rebornComplete(id); });
|
||||
curGuard.sprite.gotoAndPlay("reborn");
|
||||
|
||||
curGuard.shape = "reborn";
|
||||
curGuard.action = ACT_REBORN;
|
||||
|
||||
}
|
||||
|
||||
function rebornComplete(id)
|
||||
{
|
||||
var x = guard[id].pos.x;
|
||||
var y = guard[id].pos.y;
|
||||
|
||||
if( map[x][y].act == RUNNER_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
map[x][y].act = GUARD_T;
|
||||
guard[id].sprite.removeAllEventListeners ("animationend");
|
||||
guard[id].action = ACT_FALL;
|
||||
guard[id].shape = "fallRight";
|
||||
//guard[id].hasGold = 0;
|
||||
guard[id].sprite.gotoAndPlay("fallRight");
|
||||
soundPlay("reborn");
|
||||
}
|
||||
@@ -0,0 +1,357 @@
|
||||
|
||||
function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
|
||||
{
|
||||
var hiScoreInfo;
|
||||
var canvas2, scoreStage;
|
||||
var titleText;
|
||||
var recordId = -1;
|
||||
var savedKeyDownHander;
|
||||
var timeOutHandler = null;
|
||||
|
||||
init();
|
||||
|
||||
function init()
|
||||
{
|
||||
getHiScoreInfo();
|
||||
|
||||
if(_curScoreInfo) {
|
||||
recordId = updateScoreInfo();
|
||||
if(recordId < 0) {
|
||||
if(_callbackFun) _callbackFun();
|
||||
return; //don't need update score
|
||||
}
|
||||
}
|
||||
|
||||
createCanvas2();
|
||||
createScoreStage();
|
||||
setScoreBackground();
|
||||
drawHiScoreList();
|
||||
scoreStage.update();
|
||||
if(recordId >= 0) {
|
||||
inputHiScoreName();
|
||||
} else {
|
||||
anyKeyHandler();
|
||||
if(typeof _waitTime == "undefined") _waitTime = 3500;
|
||||
timeOutHandler = setTimeout( function() { closeScoreTable(); }, _waitTime);
|
||||
}
|
||||
}
|
||||
|
||||
function closeScoreTable()
|
||||
{
|
||||
removeCanvas2();
|
||||
restoreKeyDownHandler();
|
||||
if(_callbackFun) _callbackFun();
|
||||
}
|
||||
|
||||
function getHiScoreInfo()
|
||||
{
|
||||
var infoJSON, levelMap;
|
||||
|
||||
if(_dataId == 1) {
|
||||
infoJSON = getStorage(STORAGE_HISCORE_INFO2);
|
||||
} else {
|
||||
infoJSON = getStorage(STORAGE_HISCORE_INFO1);
|
||||
}
|
||||
|
||||
if(infoJSON) {
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
hiScoreInfo = infoObj;
|
||||
} else {
|
||||
hiScoreInfo = [];
|
||||
for(var i = 0; i < MAX_HISCORE_RECORD; i++) {
|
||||
hiScoreInfo[i] = {s:0 , n:"" , l: 0};
|
||||
}
|
||||
|
||||
if(_dataId == 1) {
|
||||
hiScoreInfo[0].n = "STEVE JOBS";
|
||||
hiScoreInfo[0].l = 1;
|
||||
hiScoreInfo[0].s = 2500;
|
||||
|
||||
hiScoreInfo[1].n = "BILL GATES";
|
||||
hiScoreInfo[1].l = 1;
|
||||
hiScoreInfo[1].s = 1500;
|
||||
} else {
|
||||
hiScoreInfo[0].n = "SIMON";
|
||||
hiScoreInfo[0].l = 1;
|
||||
hiScoreInfo[0].s = 3500;
|
||||
|
||||
hiScoreInfo[1].n = "PETER PAN";
|
||||
hiScoreInfo[1].l = 1;
|
||||
hiScoreInfo[1].s = 2000;
|
||||
|
||||
hiScoreInfo[2].n = "DASH PARR"; // The Incredibles. He is the son of Bob Parr and Helen Parr (小飛)
|
||||
hiScoreInfo[2].l = 1;
|
||||
hiScoreInfo[2].s = 1000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setHiScoreInfo()
|
||||
{
|
||||
var infoJSON = JSON.stringify(hiScoreInfo);
|
||||
|
||||
if(_dataId == 1)
|
||||
setStorage(STORAGE_HISCORE_INFO2, infoJSON);
|
||||
else
|
||||
setStorage(STORAGE_HISCORE_INFO1, infoJSON);
|
||||
}
|
||||
|
||||
function updateScoreInfo()
|
||||
{
|
||||
var addId = -1;
|
||||
|
||||
if(_curScoreInfo.s <= 0) return addId; //don't save if scroe <= 0
|
||||
|
||||
for(var i = 0; i < MAX_HISCORE_RECORD; i++) {
|
||||
_curScoreInfo.n = "";
|
||||
if(_curScoreInfo.s >= hiScoreInfo[i].s) {
|
||||
addId = i;
|
||||
hiScoreInfo.splice(i, 0, _curScoreInfo);
|
||||
hiScoreInfo.splice(MAX_HISCORE_RECORD, 1);
|
||||
setHiScoreInfo();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return addId;
|
||||
}
|
||||
|
||||
function createCanvas2()
|
||||
{
|
||||
canvas2 = document.createElement('canvas');
|
||||
canvas2.id = "canvas2";
|
||||
canvas2.width = canvasX;
|
||||
canvas2.height = canvasY;
|
||||
|
||||
//Set canvas top left position
|
||||
var left = ((screenX - canvasX)/2|0),
|
||||
top = ((screenY - canvasY)/2|0);
|
||||
canvas2.style.left = (left>0?left:0) + "px";
|
||||
canvas2.style.top = (top>0?top:0) + "px";
|
||||
canvas2.style.position = "absolute";
|
||||
document.body.appendChild(canvas2);
|
||||
}
|
||||
|
||||
function createScoreStage()
|
||||
{
|
||||
scoreStage = new createjs.Stage(canvas);
|
||||
}
|
||||
|
||||
function removeCanvas2()
|
||||
{
|
||||
scoreStage.removeAllChildren();
|
||||
scoreStage.update();
|
||||
document.body.removeChild(canvas2);
|
||||
}
|
||||
|
||||
function setScoreBackground()
|
||||
{
|
||||
//set background color
|
||||
var background = new createjs.Shape();
|
||||
background.graphics.beginFill("black").drawRect(0, 0, canvas2.width, canvas2.height);
|
||||
scoreStage.addChild(background);
|
||||
}
|
||||
|
||||
function getNameStartPos(nameLength, itemId)
|
||||
{
|
||||
var x = (4+(MAX_HISCORE_NAME_LENGTH-nameLength)/2)*tileW;
|
||||
var y = (itemId * 1.2 + 5) * tileH;
|
||||
|
||||
return { x: x, y: y };
|
||||
}
|
||||
|
||||
function drawHiScoreList()
|
||||
{
|
||||
var title = "LODE RUNNER " + ((_dataId == 1)?"2":"1") + " HIGH SCORES";
|
||||
var barTile;
|
||||
|
||||
drawText((NO_OF_TILES_X-title.length)/2*tileW, 0.5*tileH, title, scoreStage);
|
||||
drawText(0.5*tileW, 3*tileH, "NO", scoreStage);
|
||||
drawText(7*tileW, 3*tileH, "NAME", scoreStage);
|
||||
drawText(14.5*tileW, 3*tileH, "LEVEL SCORE", scoreStage);
|
||||
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
barTile = new createjs.Bitmap(preload.getResult("ground"));
|
||||
barTile.setTransform(x * tileW, 4.5*tileH , tileScale, tileScale);
|
||||
scoreStage.addChild(barTile);
|
||||
}
|
||||
|
||||
for(var i = 0; i < MAX_HISCORE_RECORD; i++) {
|
||||
var pos = getNameStartPos(hiScoreInfo[i].n.length, i);
|
||||
|
||||
drawText(0.5*tileW, pos.y, ("0"+(i+1)).slice(-2) + ".", scoreStage);
|
||||
|
||||
if(hiScoreInfo[i].s > 0) {
|
||||
if(hiScoreInfo[i].n.length > 0) {
|
||||
drawText(pos.x, pos.y, hiScoreInfo[i].n, scoreStage);
|
||||
}
|
||||
drawText(15.5*tileW, pos.y, ("00"+hiScoreInfo[i].l).slice(-3), scoreStage);
|
||||
drawText(20.5*tileW, pos.y, ("000000"+hiScoreInfo[i].s).slice(-7), scoreStage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function anyKeyHandler()
|
||||
{
|
||||
savedKeyDownHander = document.onkeydown;
|
||||
document.onkeydown = function(event) {
|
||||
if(!event){ event = window.event; }
|
||||
|
||||
//if( event.keyCode == KEYCODE_ENTER) {
|
||||
clearTimeout(timeOutHandler);
|
||||
closeScoreTable();
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
function restoreKeyDownHandler()
|
||||
{
|
||||
document.onkeydown = savedKeyDownHander;
|
||||
}
|
||||
|
||||
function inputHiScoreName()
|
||||
{
|
||||
var name, nameText;
|
||||
var curPos = 0;
|
||||
var savedKeyDownHander, hiScoreTicker;
|
||||
var cursor;
|
||||
|
||||
init();
|
||||
|
||||
function init()
|
||||
{
|
||||
name = []; //string
|
||||
nameText = []; //text object
|
||||
changeKeyDownHandler();
|
||||
|
||||
var pos = getNameStartPos(0, recordId);
|
||||
cursor = new createjs.Sprite(textData, "FLASH");
|
||||
cursor.setTransform(pos.x-tileW/2, pos.y , tileScale, tileScale);
|
||||
scoreStage.addChild(cursor);
|
||||
|
||||
hiScoreTicker = createjs.Ticker.on("tick", scoreStage);
|
||||
}
|
||||
|
||||
function changeKeyDownHandler()
|
||||
{
|
||||
savedKeyDownHander = document.onkeydown;
|
||||
document.onkeydown = handleHiScoreName;
|
||||
}
|
||||
|
||||
function cutTailSpace()
|
||||
{
|
||||
for(var i = name.length-1; i >= 0; i--) {
|
||||
if(name[i] == " ") name.splice(i,1);
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
function inputFinish()
|
||||
{
|
||||
cutTailSpace();
|
||||
redrawName();
|
||||
|
||||
//uodate name for score info
|
||||
hiScoreInfo[recordId].n = array2String(name);
|
||||
setHiScoreInfo();
|
||||
|
||||
//remove cursor
|
||||
scoreStage.removeChild(cursor);
|
||||
scoreStage.update();
|
||||
|
||||
createjs.Ticker.off("tick", hiScoreTicker);
|
||||
setTimeout( function() { closeScoreTable(); }, 1500);
|
||||
}
|
||||
|
||||
function removeNameText()
|
||||
{
|
||||
for(var i = 0; i < nameText.length; i++)
|
||||
scoreStage.removeChild(nameText[i]);
|
||||
}
|
||||
|
||||
function array2String(name)
|
||||
{
|
||||
var nameString = "";
|
||||
for(var i = 0; i < name.length; i++) {
|
||||
nameString += name[i];
|
||||
}
|
||||
return nameString;
|
||||
}
|
||||
|
||||
function redrawName()
|
||||
{
|
||||
var pos = getNameStartPos(name.length, recordId);
|
||||
removeNameText();
|
||||
nameText = drawText(pos.x, pos.y, array2String(name), scoreStage);
|
||||
|
||||
//change cursor position
|
||||
if(name.length > 0) cursor.x = pos.x + curPos * tileW;
|
||||
else cursor.x = pos.x - tileW/2;
|
||||
|
||||
//move cursor to top
|
||||
moveChild2Top(scoreStage, cursor);
|
||||
}
|
||||
|
||||
|
||||
function handleHiScoreName(event)
|
||||
{
|
||||
if(!event){ event = window.event; } //cross browser issues exist
|
||||
|
||||
|
||||
//if(event.shiftKey) {
|
||||
//} else if (event.ctrlKey) {
|
||||
//} else
|
||||
{
|
||||
var code = event.keyCode;
|
||||
|
||||
if(curPos >= MAX_HISCORE_NAME_LENGTH &&
|
||||
code != KEYCODE_BKSPACE && code != KEYCODE_LEFT && code != KEYCODE_ENTER)
|
||||
{
|
||||
soundPlay("beep"); //wrong key code
|
||||
return false;
|
||||
}
|
||||
|
||||
switch(true) {
|
||||
case (code >=65 && code <= 90): // A ~ Z
|
||||
case (code >= 97 && code <= 122): //a ~ z
|
||||
if( code > 90) code -= 32;
|
||||
name[curPos++] = String.fromCharCode(code);
|
||||
break;
|
||||
case (code == KEYCODE_DOT): //'.'
|
||||
name[curPos++] = ".";
|
||||
break;
|
||||
case (code == KEYCODE_DASH): //'-'
|
||||
name[curPos++] = "-";
|
||||
break;
|
||||
case (code == KEYCODE_SPACE): //space
|
||||
if(curPos == 0) {
|
||||
soundPlay("beep"); //wrong key code
|
||||
break;
|
||||
}
|
||||
name[curPos++] = " ";
|
||||
break;
|
||||
case (code == KEYCODE_BKSPACE): //backspace
|
||||
if(curPos == 0) break;
|
||||
name.splice(--curPos, 1);
|
||||
break;
|
||||
case (code == KEYCODE_LEFT): //LEFT
|
||||
if(curPos > 0) curPos--;
|
||||
break;
|
||||
case (code == KEYCODE_RIGHT): //RIGHT
|
||||
if(curPos < name.length) curPos++;
|
||||
break;
|
||||
case (code == KEYCODE_ENTER): //ENTER
|
||||
if(name.length > 0) inputFinish();
|
||||
else soundPlay("beep");
|
||||
default:
|
||||
//debug(code);
|
||||
if(code > 32) soundPlay("beep"); //wrong key code
|
||||
break;
|
||||
}
|
||||
|
||||
redrawName();
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Lode Runner</title>
|
||||
<!-- DON'T FORGET TO MODIFY *.web.html
|
||||
* =============================================================================
|
||||
* Lode Runner (超級運動員) - APPLE-II version
|
||||
*
|
||||
* This program is a HTML5 remake game.
|
||||
*
|
||||
* The program code base on CreateJS JavaScript libraries !
|
||||
* http://www.createjs.com/
|
||||
*
|
||||
* The AI algorithm reference book:
|
||||
* http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538
|
||||
*
|
||||
* by Simon Hung 2014/06/20 (http://simonsays-tw.com)
|
||||
* =============================================================================
|
||||
-->
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1, IE=edge">
|
||||
<meta name="description" content="GAME HTML5 JavaScript CreateJS Championship Lode Runner">
|
||||
<link href="lodeRunner.ico" rel="shortcut icon" >
|
||||
|
||||
<style>#canvas { position:absolute; left:0; top:0; }</style>
|
||||
|
||||
<script type="text/javascript" src="./lib/preloadjs-0.4.1.min.js"></script>
|
||||
<script type="text/javascript" src="./lib/soundjs-0.5.2.min.js"></script>
|
||||
<script type="text/javascript" src="./lib/tweenjs-0.5.1.min.js"></script>
|
||||
<script type="text/javascript" src="./lib/easeljs-0.7.1.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="lodeRunner.baseLevel.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.champLevel.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.storage.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.def.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.key.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.misc.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.hiscore.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.menu.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.runner.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.guard.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.demo.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.demoData1.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.edit.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.preload.js"></script>
|
||||
<script type="text/javascript" src="lodeRunner.main.js"></script>
|
||||
</head>
|
||||
<body onload="init();">
|
||||
<div class="canvas">
|
||||
<canvas id="canvas" width="960" height="400"></canvas>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
Après Largeur: | Hauteur: | Taille: 3.2 KiB |
@@ -0,0 +1,222 @@
|
||||
var keyAction = ACT_STOP; //// keyLastLeftRight = ACT_RIGHT;
|
||||
var shiftLevelNum = 0;
|
||||
var runnerDebug = 0;
|
||||
|
||||
function pressShiftKey(code)
|
||||
{
|
||||
switch(code) {
|
||||
case KEYCODE_PERIOD: //SHIFT-. = '>', change to next level
|
||||
shiftLevelNum = 1;
|
||||
gameState = GAME_NEXT_LEVEL;
|
||||
break;
|
||||
case KEYCODE_COMMA: //SHIFT-, = '<', change to previous level
|
||||
shiftLevelNum = 1;
|
||||
gameState = GAME_PREV_LEVEL;
|
||||
break;
|
||||
default:
|
||||
if(runnerDebug) debugKeyPress(code);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function pressCtrlKey(code)
|
||||
{
|
||||
switch(code) {
|
||||
case KEYCODE_A: //CTRL-A : abort level
|
||||
gameState = GAME_RUNNER_DEAD;
|
||||
break;
|
||||
case KEYCODE_C: //CTRL-C : copy current level
|
||||
copyLevelMap = levelData[curLevel-1];
|
||||
showTipsText("COPY MAP", 0);
|
||||
break;
|
||||
case KEYCODE_R: //CTRL-R : abort game
|
||||
runnerLife = 1;
|
||||
gameState = GAME_RUNNER_DEAD;
|
||||
break;
|
||||
case KEYCODE_X: //CTRL-X
|
||||
toggleTrapTile();
|
||||
break;
|
||||
case KEYCODE_S: //CTRL-S, toggle sound
|
||||
if( (soundOff ^= 1) == 1) {
|
||||
soundDig.stop();
|
||||
soundFall.stop();
|
||||
showTipsText("SOUND OFF", 0);
|
||||
} else {
|
||||
showTipsText("SOUND ON", 0);
|
||||
}
|
||||
break;
|
||||
case KEYCODE_LEFT: //SHIFT + <- : speed down
|
||||
setSpeed(-1);
|
||||
break;
|
||||
case KEYCODE_RIGHT: //SHIFT + -> : speed up
|
||||
setSpeed(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function debugKeyPress(code)
|
||||
{
|
||||
switch(code) {
|
||||
case KEYCODE_1: //SHIFT-1 , add 5 level
|
||||
shiftLevelNum = 5;
|
||||
gameState = GAME_NEXT_LEVEL;
|
||||
break;
|
||||
case KEYCODE_2: //SHIFT-2 , add 10 level
|
||||
shiftLevelNum = 10;
|
||||
gameState = GAME_NEXT_LEVEL;
|
||||
break;
|
||||
case KEYCODE_3: //SHIFT-3 , add 20 level
|
||||
shiftLevelNum = 20;
|
||||
gameState = GAME_NEXT_LEVEL;
|
||||
break;
|
||||
case KEYCODE_4: //SHIFT-4 , add 50 level
|
||||
shiftLevelNum = 50;
|
||||
gameState = GAME_NEXT_LEVEL;
|
||||
break;
|
||||
case KEYCODE_6: //SHIFT-6 , dec 5 level
|
||||
shiftLevelNum = 5;
|
||||
gameState = GAME_PREV_LEVEL;
|
||||
break;
|
||||
case KEYCODE_7: //SHIFT-7 , dec 10 level
|
||||
shiftLevelNum = 10;
|
||||
gameState = GAME_PREV_LEVEL;
|
||||
break;
|
||||
case KEYCODE_8: //SHIFT-8 , dec 20 level
|
||||
shiftLevelNum = 20;
|
||||
gameState = GAME_PREV_LEVEL;
|
||||
break;
|
||||
case KEYCODE_9: //SHIFT-9 , dec 50 level
|
||||
shiftLevelNum = 50;
|
||||
gameState = GAME_PREV_LEVEL;
|
||||
break;
|
||||
case KEYCODE_UP: //SHIFT-UP, inc runner
|
||||
if(runnerLife < 10) {
|
||||
runnerLife++;
|
||||
drawLife();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function setSpeed(v)
|
||||
{
|
||||
speed += v;
|
||||
if(speed < 0) speed = 0;
|
||||
if(speed >= speedMode.length) speed = speedMode.length-1;
|
||||
createjs.Ticker.setFPS(speedMode[speed]);
|
||||
showTipsText(speedText[speed], 0);
|
||||
}
|
||||
|
||||
function helpCallBack() //help complete call back
|
||||
{
|
||||
pressKey(KEYCODE_ESC);
|
||||
}
|
||||
|
||||
function pressKey(code)
|
||||
{
|
||||
switch(code) {
|
||||
case KEYCODE_LEFT:
|
||||
case KEYCODE_J:
|
||||
keyAction = ACT_LEFT;
|
||||
break;
|
||||
case KEYCODE_RIGHT:
|
||||
case KEYCODE_L:
|
||||
keyAction = ACT_RIGHT;
|
||||
break;
|
||||
case KEYCODE_UP:
|
||||
case KEYCODE_I:
|
||||
keyAction = ACT_UP;
|
||||
break;
|
||||
case KEYCODE_DOWN:
|
||||
case KEYCODE_K:
|
||||
keyAction = ACT_DOWN;
|
||||
break;
|
||||
case KEYCODE_Z:
|
||||
case KEYCODE_U:
|
||||
keyAction = ACT_DIG_LEFT;
|
||||
break;
|
||||
case KEYCODE_X:
|
||||
case KEYCODE_O:
|
||||
keyAction = ACT_DIG_RIGHT;
|
||||
break;
|
||||
case KEYCODE_ESC: //help & pause
|
||||
if(gameState == GAME_PAUSE) {
|
||||
gameResume();
|
||||
showTipsText("", 0); //clear text
|
||||
} else {
|
||||
gamePause();
|
||||
showTipsText("PAUSE", 1); //display "PAUSE"
|
||||
//helpObj.showHelp(helpCallBack);
|
||||
}
|
||||
break;
|
||||
case KEYCODE_ENTER: //display hi-score
|
||||
if(playMode == PLAY_CLASSIC) {
|
||||
menuIconDisable(1);
|
||||
gamePause();
|
||||
showScoreTable(playData-1, null, function() { menuIconEnable(); gameResume();});
|
||||
} else {
|
||||
keyAction = ACT_UNKNOWN;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
keyAction = ACT_UNKNOWN;
|
||||
//debug("keycode = " + code);
|
||||
break;
|
||||
}
|
||||
if(recordMode && code != KEYCODE_ESC) saveKeyCode(code);
|
||||
}
|
||||
|
||||
function gameResume()
|
||||
{
|
||||
gameState = lastGameState;
|
||||
soundResume(soundFall);
|
||||
soundResume(soundDig);
|
||||
}
|
||||
|
||||
function gamePause()
|
||||
{
|
||||
lastGameState = gameState;
|
||||
gameState = GAME_PAUSE;
|
||||
soundPause(soundFall);
|
||||
soundPause(soundDig);
|
||||
}
|
||||
|
||||
function handleKeyDown(event)
|
||||
{
|
||||
if(!event){ event = window.event; } //cross browser issues exist
|
||||
|
||||
if(event.shiftKey) {
|
||||
if(gameState == GAME_START || gameState == GAME_RUNNING) {
|
||||
pressShiftKey(event.keyCode);
|
||||
}
|
||||
} else
|
||||
if (event.ctrlKey) {
|
||||
if(gameState == GAME_START || gameState == GAME_RUNNING) {
|
||||
pressCtrlKey(event.keyCode);
|
||||
}
|
||||
} else {
|
||||
if((gameState == GAME_PAUSE && event.keyCode == KEYCODE_ESC) ||
|
||||
gameState == GAME_START || gameState == GAME_RUNNING)
|
||||
{
|
||||
if(recordMode != RECORD_PLAY && playMode != PLAY_AUTO) {
|
||||
pressKey(event.keyCode);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/*
|
||||
//e.cancelBubble is supported by IE - this will kill the bubbling process.
|
||||
event.cancelBubble = true;
|
||||
event.returnValue = false;
|
||||
|
||||
//event.stopPropagation works only in Firefox.
|
||||
if (event.stopPropagation) {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
}
|
||||
*/
|
||||
if(event.keyCode >= 112 && event.keyCode <= 123) return true; //F1 ~ F12
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
//============
|
||||
// MISC
|
||||
//============
|
||||
var DEBUG = 0;
|
||||
var demoSoundOff = 1;
|
||||
function debug(string) {
|
||||
if(DEBUG) console.log(string);
|
||||
}
|
||||
|
||||
function assert(expression, msg)
|
||||
{
|
||||
if(DEBUG) console.assert(expression, msg);
|
||||
}
|
||||
|
||||
function getScreenSize()
|
||||
{
|
||||
var x, y;
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Window size and scrolling:
|
||||
// URL: http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
|
||||
//----------------------------------------------------------------------
|
||||
if (typeof (window.innerWidth) == 'number') {
|
||||
//Non-IE
|
||||
x = window.innerWidth;
|
||||
y = window.innerHeight;
|
||||
} else if ((document.documentElement) &&
|
||||
(document.documentElement.clientWidth || document.documentElement.clientHeight)) {
|
||||
//IE 6+ in 'standards compliant mode'
|
||||
x = document.documentElement.clientWidth;
|
||||
y = document.documentElement.clientHeight;
|
||||
} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
|
||||
//IE 4 compatible
|
||||
x = document.body.clientWidth;
|
||||
y = document.body.clientHeight;
|
||||
}
|
||||
return {x:x, y:y};
|
||||
}
|
||||
|
||||
//==============================
|
||||
// Too many user created Levels
|
||||
//==============================
|
||||
var editWarningText = null;
|
||||
function editWarningMsg(hidden)
|
||||
{
|
||||
var x, y, width, height;
|
||||
|
||||
if(editWarningText == null)
|
||||
editWarningText = new createjs.Text("Too many user created levels !",
|
||||
"bold " + (64*tileScale) + "px Helvetica", "#fc5c1c");
|
||||
|
||||
width = editWarningText.getBounds().width;
|
||||
height = editWarningText.getBounds().height;
|
||||
x = editWarningText.x = (NO_OF_TILES_X*(tileW+EDIT_PADDING) - width) / 2 | 0;
|
||||
y = editWarningText.y = (NO_OF_TILES_Y*tileH - height) / 2 | 0;
|
||||
editWarningText.shadow = new createjs.Shadow("white", 2, 2, 1);
|
||||
|
||||
if(hidden) {
|
||||
mainStage.removeChild(editWarningText);
|
||||
} else {
|
||||
mainStage.addChild(editWarningText);
|
||||
}
|
||||
mainStage.update();
|
||||
}
|
||||
|
||||
//================================
|
||||
// show tips messgae
|
||||
//===============================
|
||||
function showTipsMsg(_tipsTxt, _stage, _scale)
|
||||
{
|
||||
var TEXT_SIZE = 72* _scale;
|
||||
var TEXT_COLOR = "#ff2020";
|
||||
var tipsText = new createjs.Text(_tipsTxt, "bold " + TEXT_SIZE + "px Helvetica", TEXT_COLOR);
|
||||
var screenX = _stage.canvas.width;
|
||||
var screenY = _stage.canvas.height;
|
||||
|
||||
tipsText.x = (screenX) / 2 | 0;
|
||||
tipsText.y = screenY/2 - tipsText.getBounds().height*5/4 | 0;
|
||||
tipsText.shadow = new createjs.Shadow("white", 3, 3, 2);
|
||||
tipsText.textAlign = "center";
|
||||
|
||||
_stage.addChild(tipsText);
|
||||
|
||||
createjs.Tween.get(tipsText).set({alpha:1}).wait(50).to({scaleX:1.2, scaleY:1.2, alpha:0}, 2000)
|
||||
.call(function(){_stage.removeChild(tipsText);});
|
||||
}
|
||||
|
||||
//==========================================
|
||||
// move z-index to top for a child of stage
|
||||
//==========================================
|
||||
function moveChild2Top(stage, obj)
|
||||
{
|
||||
stage.setChildIndex(obj, stage.getNumChildren() - 1);
|
||||
}
|
||||
|
||||
//==========================
|
||||
// BEGIN for Sound function
|
||||
//==========================
|
||||
var soundOff = 0;
|
||||
function soundPlay(name)
|
||||
{
|
||||
if(soundOff || playMode == PLAY_AUTO || (playMode == PLAY_DEMO && demoSoundOff)) return;
|
||||
|
||||
if(typeof name == "string") {
|
||||
return createjs.Sound.play(name);
|
||||
} else {
|
||||
name.play();
|
||||
}
|
||||
}
|
||||
|
||||
function soundStop(name)
|
||||
{
|
||||
if(soundOff || playMode == PLAY_AUTO || (playMode == PLAY_DEMO && demoSoundOff)) return;
|
||||
|
||||
if(typeof name == "string") {
|
||||
return createjs.Sound.stop(name);
|
||||
} else {
|
||||
name.stop();
|
||||
}
|
||||
}
|
||||
|
||||
function soundPause(name)
|
||||
{
|
||||
if(soundOff || playMode == PLAY_AUTO || (playMode == PLAY_DEMO && demoSoundOff)) return;
|
||||
|
||||
if(typeof name == "string") {
|
||||
return createjs.Sound.pause(name);
|
||||
} else {
|
||||
name.pause();
|
||||
}
|
||||
}
|
||||
|
||||
function soundResume(name)
|
||||
{
|
||||
if(soundOff || playMode == PLAY_AUTO || (playMode == PLAY_DEMO && demoSoundOff)) return;
|
||||
|
||||
if(typeof name == "string") {
|
||||
return createjs.Sound.resume(name);
|
||||
} else {
|
||||
name.resume();
|
||||
}
|
||||
}
|
||||
|
||||
//===============
|
||||
// Random Object
|
||||
//===============
|
||||
function rangeRandom(minValue, maxValue, seedValue)
|
||||
{
|
||||
var rndList, idx, items;
|
||||
var min, max;
|
||||
var reset;
|
||||
var seed = 0;
|
||||
|
||||
function rndStart()
|
||||
{
|
||||
var swapId, tmp;
|
||||
|
||||
rndList = [];
|
||||
for(var i = 0; i < items; i++) rndList[i] = min + i;
|
||||
for(var i = 0; i < items; i++) {
|
||||
if(seedValue > 0) {
|
||||
seed = seedValue;
|
||||
swapId = (seedRandom() * items) | 0;
|
||||
} else {
|
||||
swapId = (Math.random() * items) | 0;
|
||||
}
|
||||
tmp = rndList[i];
|
||||
rndList[i] = rndList[swapId];
|
||||
rndList[swapId] = tmp;
|
||||
}
|
||||
idx = 0;
|
||||
//debug(rndList);
|
||||
}
|
||||
|
||||
function seedRandom()
|
||||
{
|
||||
var x = Math.sin(seed++) * 10000;
|
||||
return x - Math.floor(x);
|
||||
}
|
||||
|
||||
this.get = function ()
|
||||
{
|
||||
if( idx >= items) {
|
||||
rndStart();
|
||||
reset = 1;
|
||||
} else {
|
||||
reset = 0;
|
||||
}
|
||||
return rndList[idx++];
|
||||
}
|
||||
|
||||
this.rndReset = function ()
|
||||
{
|
||||
return reset;
|
||||
}
|
||||
|
||||
//---------
|
||||
// initial
|
||||
//---------
|
||||
reset = 0;
|
||||
min = minValue;
|
||||
max = maxValue;
|
||||
if(min > max) { //swap
|
||||
var tmp;
|
||||
tmp = min;
|
||||
min = max;
|
||||
max = tmp;
|
||||
}
|
||||
items = max - min + 1;
|
||||
|
||||
rndStart();
|
||||
}
|
||||
@@ -0,0 +1,436 @@
|
||||
var RUNNER_SPEED = 0.65;
|
||||
var DIG_SPEED = 0.68; //for support champLevel, change DIG_SPEED and FILL_SPEED, 2014/04/12
|
||||
var FILL_SPEED = 0.24;
|
||||
var GUARD_SPEED = 0.3;
|
||||
|
||||
var FLASH_SPEED = 0.25; //for flash cursor (hi-score input mode)
|
||||
|
||||
var COVER_PROGRESS_BAR_H = 32;
|
||||
var COVER_PROGRESS_UNDER_Y = 116;
|
||||
var COVER_RUNNER_UNDER_Y = 164;
|
||||
var COVER_SIDE_X = 56;
|
||||
|
||||
//*********************
|
||||
// preload cover page
|
||||
//*********************
|
||||
var coverBitmap, remakeBitmap;
|
||||
var helpObj, helpBitmap, editHelpBitmap, demoHelpBitmap;
|
||||
var mainMenuIconBitmap, mainMenuIconObj;
|
||||
var selectIconBitmap, selectIconObj;
|
||||
var checkBitmap;
|
||||
var returnBitmap, select1Bitmap, nextBitmap;
|
||||
var yesBitmap, noBitmap;
|
||||
var coverPageLoad;
|
||||
|
||||
function showLoadingPage()
|
||||
{
|
||||
var coverPageImages = [
|
||||
{ src: "image/cover.png", id: "cover" },
|
||||
{ src: "image/runner.png", id: "runner" }
|
||||
];
|
||||
|
||||
coverPageLoad = new createjs.LoadQueue(true);
|
||||
coverPageLoad.on("error", handleCoverPageError);
|
||||
coverPageLoad.on("fileload", handleCoverPageFileLoad);
|
||||
coverPageLoad.on("complete", handleCoverPageComplete);
|
||||
coverPageLoad.loadManifest(coverPageImages);
|
||||
|
||||
function handleCoverPageError(e)
|
||||
{
|
||||
console.log("error", e);
|
||||
}
|
||||
|
||||
function handleCoverPageFileLoad(e)
|
||||
{
|
||||
switch(e.item.id) {
|
||||
case "cover":
|
||||
addCover2Screen(e.result);
|
||||
break;
|
||||
case "runner":
|
||||
createRunnerSpriteSheet(e.result);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function handleCoverPageComplete(e)
|
||||
{
|
||||
preloadResource();
|
||||
}
|
||||
|
||||
function addCover2Screen(image)
|
||||
{
|
||||
coverBitmap = new createjs.Bitmap(image);
|
||||
coverBitmap.setTransform(0, 0, tileScale, tileScale); //x,y, scaleX, scaleY
|
||||
mainStage.addChild(coverBitmap);
|
||||
mainStage.update();
|
||||
}
|
||||
|
||||
function createRunnerSpriteSheet(runnerImage)
|
||||
{
|
||||
runnerData = new createjs.SpriteSheet({
|
||||
images: [runnerImage],
|
||||
|
||||
frames: { regX:0, height: BASE_TILE_Y, regY:0, width: BASE_TILE_X},
|
||||
|
||||
animations: {
|
||||
runRight: [0,2, "runRight", RUNNER_SPEED],
|
||||
runLeft : [3,5, "runLeft", RUNNER_SPEED],
|
||||
runUpDn : [6,7, "runUpDn", RUNNER_SPEED],
|
||||
|
||||
barRight: {
|
||||
frames: [ 9, 10, 10, 11, 11 ],
|
||||
next: "barRight",
|
||||
speed: RUNNER_SPEED
|
||||
},
|
||||
|
||||
barLeft: {
|
||||
frames: [ 12, 13, 13, 14, 14 ],
|
||||
next: "barLeft",
|
||||
speed: RUNNER_SPEED
|
||||
},
|
||||
|
||||
digRight: 15,
|
||||
digLeft : 16,
|
||||
|
||||
fallRight : 8,
|
||||
fallLeft: 17
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
//BEGIN of preload
|
||||
//*****************************************************************************
|
||||
var preload; //preload resource object
|
||||
var firstPlay = 0;
|
||||
|
||||
var runnerData, guardData;
|
||||
var holeData, holeObj = {};
|
||||
var textData;
|
||||
|
||||
var soundFall, soundDig, soundPass, soundEnding;
|
||||
|
||||
function preloadResource()
|
||||
{
|
||||
var runnerSprite = new createjs.Sprite(runnerData, "runRight");
|
||||
var progress = new createjs.Shape();
|
||||
var progressBorder = new createjs.Shape();
|
||||
var percentTxt = new createjs.Text("0", (COVER_PROGRESS_BAR_H* tileScale) + "px Arial", "#FF0000");
|
||||
|
||||
var resource = [
|
||||
{ src: "image/remake.png", id: "remake" },
|
||||
|
||||
{ src: "image/empty.png", id: "empty" },
|
||||
{ src: "image/brick.png", id: "brick" },
|
||||
{ src: "image/block.png", id: "solid" },
|
||||
{ src: "image/ladder.png", id: "ladder" },
|
||||
{ src: "image/rope.png", id: "rope" },
|
||||
{ src: "image/trap.png", id: "trapBrick" },
|
||||
{ src: "image/hladder.png", id: "hladder" },
|
||||
{ src: "image/gold.png", id: "gold" },
|
||||
{ src: "image/guard1.png", id: "guard1" },
|
||||
{ src: "image/runner1.png", id: "runner1" },
|
||||
{ src: "image/eraser.png", id: "eraser" },
|
||||
|
||||
{ src: "image/guard.png", id: "guard" },
|
||||
{ src: "image/hole.png", id: "hole" },
|
||||
{ src: "image/over.png", id: "over" },
|
||||
|
||||
{ src: "image/ground.png", id: "ground" },
|
||||
{ src: "image/text.png", id: "text" },
|
||||
|
||||
{ src: "image/help.png", id: "help" },
|
||||
{ src: "image/editHelp.png",id: "editHelp" },
|
||||
{ src: "image/demoHelp.png",id: "demoHelp" },
|
||||
|
||||
{ src: "image/menu.png", id: "menu" },
|
||||
{ src: "image/select.png", id: "select" },
|
||||
{ src: "image/check.png", id: "check" }, //check icon for select menu
|
||||
|
||||
{ src: "image/return.png", id: "return" },
|
||||
{ src: "image/select1.png", id: "select1" },
|
||||
{ src: "image/next.png", id: "next" },
|
||||
|
||||
{ src: "image/yes.png", id: "yes" },
|
||||
{ src: "image/no.png", id: "no" },
|
||||
|
||||
|
||||
{ src: "sound/born.mp3", id:"reborn"},
|
||||
{ src: "sound/dead.mp3", id:"dead"},
|
||||
{ src: "sound/dig.mp3", id:"dig"},
|
||||
{ src: "sound/getGold.mp3", id:"getGold"},
|
||||
{ src: "sound/fall.mp3", id:"fall"},
|
||||
{ src: "sound/down.mp3", id:"down"},
|
||||
{ src: "sound/pass.mp3", id:"pass"},
|
||||
{ src: "sound/trap.mp3", id:"trap"},
|
||||
|
||||
{ src: "sound/goldFinish.mp3", id:"goldFinish"},
|
||||
{ src: "sound/ending.mp3", id:"ending"},
|
||||
{ src: "sound/scoreBell.mp3", id:"scoreBell"},
|
||||
{ src: "sound/scoreCount.mp3", id:"scoreCount"},
|
||||
{ src: "sound/scoreEnding.mp3", id:"scoreEnding"},
|
||||
|
||||
{ src: "sound/beep.mp3", id:"beep"},
|
||||
|
||||
{ src: "cursor/openhand.cur", id:"openHand"}, //preload cursor
|
||||
{ src: "cursor/closedhand.cur", id:"closeHand"}
|
||||
|
||||
];
|
||||
|
||||
preload = new createjs.LoadQueue(true);
|
||||
createjs.Sound.alternateExtensions = ["ogg"];
|
||||
preload.installPlugin(createjs.Sound);
|
||||
preload.on("error", handleFileError);
|
||||
preload.on("progress", handleProgress);
|
||||
preload.on("complete", handleComplete);
|
||||
|
||||
preload.loadManifest(resource);
|
||||
|
||||
createjs.Ticker.setFPS(30);
|
||||
var preloadTicker = createjs.Ticker.on("tick", mainStage);
|
||||
|
||||
//Set runner sprite size & position
|
||||
runnerSprite.setTransform(COVER_SIDE_X* tileScale,
|
||||
(BASE_SCREEN_Y - COVER_RUNNER_UNDER_Y)* tileScale,
|
||||
tileScale,
|
||||
tileScale);
|
||||
runnerSprite.gotoAndPlay();
|
||||
|
||||
var width = canvas.width - 2*COVER_SIDE_X* tileScale;
|
||||
var height = COVER_PROGRESS_BAR_H * tileScale;
|
||||
|
||||
//Set progress & progressborder size & position
|
||||
progressBorder.graphics.beginStroke("gold").drawRect(0,0,width,height);
|
||||
progress.x = progressBorder.x = COVER_SIDE_X * tileScale;
|
||||
progress.y = progressBorder.y = (BASE_SCREEN_Y - COVER_PROGRESS_UNDER_Y) * tileScale;
|
||||
|
||||
//Set percentTxt position
|
||||
percentTxt.x = (canvas.width - percentTxt.getBounds().width) / 2 | 0;
|
||||
percentTxt.y = (BASE_SCREEN_Y - COVER_PROGRESS_UNDER_Y) * tileScale;
|
||||
|
||||
mainStage.addChild(runnerSprite, progress, progressBorder, percentTxt);
|
||||
|
||||
function handleFileError(event)
|
||||
{
|
||||
console.log("error", event);
|
||||
}
|
||||
|
||||
function handleProgress(event)
|
||||
{
|
||||
progress.graphics.clear();
|
||||
progress.graphics.beginFill("gold").drawRect(0,0,width*(event.loaded / event.total),height);
|
||||
percentTxt.text = (100*(event.loaded / event.total)|0) + "%";
|
||||
percentTxt.x = (canvas.width - percentTxt.getBounds().width) / 2 | 0;
|
||||
}
|
||||
|
||||
function handleComplete(event)
|
||||
{
|
||||
percentTxt.text = "100%";
|
||||
mainStage.update();
|
||||
createSpriteSheet();
|
||||
createSoundInstance();
|
||||
setTimeout(clearLoadingInfo, 500);
|
||||
}
|
||||
|
||||
function createSpriteSheet()
|
||||
{
|
||||
guardData = new createjs.SpriteSheet({
|
||||
images: [preload.getResult("guard")],
|
||||
|
||||
frames: {regX:0, height: BASE_TILE_Y, regY: 0, width: BASE_TILE_X},
|
||||
|
||||
animations: {
|
||||
runRight: [0,2, "runRight", GUARD_SPEED],
|
||||
runLeft : [3,5, "runLeft", GUARD_SPEED],
|
||||
runUpDn : [6,7, "runUpDn", GUARD_SPEED],
|
||||
|
||||
barRight: {
|
||||
frames: [ 11, 12, 12, 13, 13 ],
|
||||
next: "barRight",
|
||||
speed: GUARD_SPEED
|
||||
},
|
||||
|
||||
barLeft: {
|
||||
frames: [ 14, 15, 15, 16, 16 ],
|
||||
next: "barLeft",
|
||||
speed: GUARD_SPEED
|
||||
},
|
||||
|
||||
reborn: {
|
||||
frames: [ 17, 17, 18 ],
|
||||
speed: GUARD_SPEED
|
||||
},
|
||||
|
||||
fallRight : 8,
|
||||
fallLeft: 19,
|
||||
|
||||
shakeRight: {
|
||||
frames: [ 8, 8, 8, 8, 8, 8, 8,
|
||||
8, 8, 8, 8, 8, 8,
|
||||
9, 10, 9, 10, 8 ],
|
||||
next: null,
|
||||
speed: GUARD_SPEED
|
||||
},
|
||||
|
||||
shakeLeft: {
|
||||
frames: [ 19, 19, 19, 19, 19, 19, 19,
|
||||
19, 19, 19, 19, 19, 19,
|
||||
20, 21, 20, 21, 19],
|
||||
next: null,
|
||||
speed: GUARD_SPEED
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
holeData = new createjs.SpriteSheet( {
|
||||
images: [preload.getResult("hole")],
|
||||
|
||||
frames: [
|
||||
//dig hole Left
|
||||
[BASE_TILE_X*0,0,BASE_TILE_X,BASE_TILE_Y*2], //0 [x,y, width, height]
|
||||
[BASE_TILE_X*1,0,BASE_TILE_X,BASE_TILE_Y*2], //1
|
||||
[BASE_TILE_X*2,0,BASE_TILE_X,BASE_TILE_Y*2], //2
|
||||
[BASE_TILE_X*3,0,BASE_TILE_X,BASE_TILE_Y*2], //3
|
||||
[BASE_TILE_X*4,0,BASE_TILE_X,BASE_TILE_Y*2], //4
|
||||
[BASE_TILE_X*5,0,BASE_TILE_X,BASE_TILE_Y*2], //5
|
||||
[BASE_TILE_X*6,0,BASE_TILE_X,BASE_TILE_Y*2], //6
|
||||
[BASE_TILE_X*7,0,BASE_TILE_X,BASE_TILE_Y*2], //7
|
||||
|
||||
//dig hole right
|
||||
[BASE_TILE_X*0,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //08
|
||||
[BASE_TILE_X*1,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //09
|
||||
[BASE_TILE_X*2,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //10
|
||||
[BASE_TILE_X*3,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //11
|
||||
[BASE_TILE_X*4,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //12
|
||||
[BASE_TILE_X*5,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //13
|
||||
[BASE_TILE_X*6,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //14
|
||||
[BASE_TILE_X*7,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //15
|
||||
|
||||
//fill hole
|
||||
[BASE_TILE_X*8,0, BASE_TILE_X,BASE_TILE_Y], //16
|
||||
[BASE_TILE_X*8,BASE_TILE_Y, BASE_TILE_X,BASE_TILE_Y], //17
|
||||
[BASE_TILE_X*8,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y], //18
|
||||
[BASE_TILE_X*8,BASE_TILE_Y*3,BASE_TILE_X,BASE_TILE_Y] //19
|
||||
],
|
||||
|
||||
animations: {
|
||||
digHoleLeft: [0, 7, false, DIG_SPEED],
|
||||
digHoleRight: [8,15, false, DIG_SPEED],
|
||||
fillHole: {
|
||||
frames: [16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
17, 17, 18, 18, 19 ], //delay fill time for champLevel, 2014/04/12
|
||||
next: false,
|
||||
speed: FILL_SPEED
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
holeObj.sprite = new createjs.Sprite(holeData, "digHoleLeft");
|
||||
holeObj.action = ACT_STOP; //no digging
|
||||
|
||||
textData = new createjs.SpriteSheet({
|
||||
images: [preload.getResult("text")],
|
||||
|
||||
frames: {regX:0, height: BASE_TILE_Y, regY: 0, width: BASE_TILE_X},
|
||||
|
||||
animations: {
|
||||
"N0": 0, "N1": 1, "N2": 2, "N3": 3, "N4": 4,
|
||||
"N5": 5, "N6": 6, "N7": 7, "N8": 8, "N9": 9,
|
||||
"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17,
|
||||
"I": 18, "J": 19, "K": 20, "L": 21, "M": 22, "N": 23, "O": 24, "P": 25,
|
||||
"Q": 26, "R": 27, "S": 28, "T": 29, "U": 30, "V": 31, "W": 32, "X": 33,
|
||||
"Y": 34, "Z": 35,
|
||||
"DOT": 36, "LT": 37, "GT": 38, "DASH": 39,
|
||||
"@":40, //gold
|
||||
"#":41, //trap
|
||||
"SPACE":43,
|
||||
"FLASH": {
|
||||
frames: [42, 42, 42, 43, 43, 43],
|
||||
next: "FLASH",
|
||||
speed: FLASH_SPEED
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function createSoundInstance()
|
||||
{
|
||||
soundFall = createjs.Sound.createInstance("fall");
|
||||
soundDig = createjs.Sound.createInstance("dig");
|
||||
soundPass = createjs.Sound.createInstance("pass");
|
||||
|
||||
soundEnding = createjs.Sound.createInstance("ending");
|
||||
|
||||
}
|
||||
|
||||
function clearLoadingInfo()
|
||||
{
|
||||
mainStage.removeChild(runnerSprite, progress, progressBorder, percentTxt);
|
||||
showRemakeBitmap();
|
||||
mainStage.addChild(remakeBitmap);
|
||||
mainStage.update();
|
||||
}
|
||||
|
||||
//create remake 2014
|
||||
function showRemakeBitmap()
|
||||
{
|
||||
var x = 372 * tileScale;
|
||||
var y = 128 * tileScale;
|
||||
remakeBitmap = new createjs.Bitmap(preload.getResult("remake"));
|
||||
remakeBitmap.setTransform(x, y, tileScale, tileScale); //x,y, scaleX, scaleY
|
||||
remakeBitmap.rotation = -5;
|
||||
remakeBitmap.set({alpha:0});
|
||||
createjs.Tween.get(remakeBitmap).set({alpha:0}).to({alpha:1}, 500).call(preloadComplet);
|
||||
}
|
||||
|
||||
function createHelpObj()
|
||||
{
|
||||
helpBitmap = new createjs.Bitmap(preload.getResult("help"));
|
||||
editHelpBitmap = new createjs.Bitmap(preload.getResult("editHelp"));
|
||||
demoHelpBitmap = new createjs.Bitmap(preload.getResult("demoHelp"));
|
||||
|
||||
helpObj = new helpMenuClass(mainStage, helpBitmap, editHelpBitmap, demoHelpBitmap, tileScale);
|
||||
}
|
||||
|
||||
function createMenuBitmapIcon()
|
||||
{
|
||||
mainMenuIconBitmap = new createjs.Bitmap(preload.getResult("menu"));
|
||||
mainMenuIconObj = new mainMenuIconClass(screenX, screenY, tileScale, mainMenuIconBitmap);
|
||||
|
||||
selectIconBitmap = new createjs.Bitmap(preload.getResult("select"));
|
||||
selectIconObj = new selectIconClass(screenX, screenY, tileScale, selectIconBitmap);
|
||||
|
||||
checkBitmap = new createjs.Bitmap(preload.getResult("check"));
|
||||
|
||||
returnBitmap = new createjs.Bitmap(preload.getResult("return"));
|
||||
select1Bitmap = new createjs.Bitmap(preload.getResult("select1"));
|
||||
nextBitmap = new createjs.Bitmap(preload.getResult("next"));
|
||||
|
||||
yesBitmap = new createjs.Bitmap(preload.getResult("yes"));
|
||||
noBitmap = new createjs.Bitmap(preload.getResult("no"));
|
||||
|
||||
}
|
||||
|
||||
function getFirstPlayInfo()
|
||||
{
|
||||
if(getStorage(STORAGE_FIRST_PLAY) == null) {
|
||||
firstPlay = 1;
|
||||
setStorage(STORAGE_FIRST_PLAY, 1);
|
||||
}
|
||||
}
|
||||
|
||||
function preloadComplet()
|
||||
{
|
||||
createHelpObj();
|
||||
createMenuBitmapIcon();
|
||||
getFirstPlayInfo();
|
||||
createjs.Ticker.off("tick", preloadTicker); //remove ticker of cover page
|
||||
waitIdleDemo(4000); //wait user key or show demo level
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,627 @@
|
||||
//=============================================================================
|
||||
// AI reference book: "玩 Lode Runner 學 C 語言"
|
||||
// http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538
|
||||
//=============================================================================
|
||||
|
||||
var STATE_OK_TO_MOVE = 1, STATE_FALLING = 2;
|
||||
|
||||
function moveRunner()
|
||||
{
|
||||
var x = runner.pos.x;
|
||||
var xOffset = runner.pos.xOffset;
|
||||
var y = runner.pos.y;
|
||||
var yOffset = runner.pos.yOffset;
|
||||
|
||||
var curState;
|
||||
var curToken, nextToken;
|
||||
|
||||
curToken = map[x][y].base;
|
||||
|
||||
if ( curToken == LADDR_T || (curToken == BAR_T && yOffset == 0) ) { //ladder & bar
|
||||
curState = STATE_OK_TO_MOVE; //ok to move (on ladder or bar)
|
||||
} else if (yOffset < 0) { //no ladder && yOffset < 0 ==> falling
|
||||
curState = STATE_FALLING;
|
||||
} else if (y < maxTileY) { //no laddr && y < maxTileY && yOffset >= 0
|
||||
|
||||
nextToken = map[x][y+1].act;
|
||||
|
||||
switch (true) {
|
||||
case (nextToken == EMPTY_T):
|
||||
curState = STATE_FALLING;
|
||||
break;
|
||||
case ( nextToken == BLOCK_T || nextToken == LADDR_T || nextToken == SOLID_T):
|
||||
curState = STATE_OK_TO_MOVE;
|
||||
break;
|
||||
case ( nextToken == GUARD_T):
|
||||
curState = STATE_OK_TO_MOVE;
|
||||
break;
|
||||
default:
|
||||
curState = STATE_FALLING;
|
||||
break;
|
||||
}
|
||||
} else { // no laddr && y == maxTileY
|
||||
curState = STATE_OK_TO_MOVE;
|
||||
}
|
||||
|
||||
if ( curState == STATE_FALLING ) {
|
||||
stayCurrPos = ( y >= maxTileY ||
|
||||
(nextToken = map[x][y+1].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == GUARD_T);
|
||||
|
||||
runnerMoveStep(ACT_FALL, stayCurrPos);
|
||||
return;
|
||||
}
|
||||
|
||||
/****** Check Key Action ******/
|
||||
|
||||
var moveStep = ACT_STOP;
|
||||
var stayCurrPos = 1;
|
||||
|
||||
switch(keyAction) {
|
||||
case ACT_UP:
|
||||
stayCurrPos = ( y <= 0 ||
|
||||
( nextToken = map[x][y-1].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T );
|
||||
|
||||
if (y > 0 && map[x][y].base != LADDR_T && yOffset < H4 && yOffset > 0 && map[x][y+1].base == LADDR_T)
|
||||
{
|
||||
stayCurrPos = 1;
|
||||
moveStep = ACT_UP;
|
||||
} else
|
||||
if (!( map[x][y].base != LADDR_T &&
|
||||
(yOffset <= 0 || map[x][y+1].base != LADDR_T) ||
|
||||
(yOffset <= 0 && stayCurrPos ) )
|
||||
) {
|
||||
moveStep = ACT_UP;
|
||||
}
|
||||
|
||||
break;
|
||||
case ACT_DOWN:
|
||||
stayCurrPos = ( y >= maxTileY ||
|
||||
(nextToken = map[x][y+1].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T);
|
||||
|
||||
if (!(yOffset >= 0 && stayCurrPos))
|
||||
moveStep = ACT_DOWN;
|
||||
break;
|
||||
case ACT_LEFT:
|
||||
stayCurrPos = ( x <= 0 ||
|
||||
(nextToken = map[x-1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T);
|
||||
|
||||
if (!(xOffset <= 0 && stayCurrPos))
|
||||
moveStep = ACT_LEFT;
|
||||
break;
|
||||
case ACT_RIGHT:
|
||||
stayCurrPos = ( x >= maxTileX ||
|
||||
(nextToken = map[x+1][y].act) == BLOCK_T ||
|
||||
nextToken == SOLID_T || nextToken == TRAP_T);
|
||||
|
||||
if (!(xOffset >= 0 && stayCurrPos))
|
||||
moveStep = ACT_RIGHT;
|
||||
break;
|
||||
case ACT_DIG_LEFT:
|
||||
case ACT_DIG_RIGHT:
|
||||
if(ok2Dig(keyAction)) {
|
||||
runnerMoveStep(keyAction, stayCurrPos);
|
||||
digHole(keyAction);
|
||||
} else {
|
||||
runnerMoveStep(ACT_STOP, stayCurrPos);
|
||||
}
|
||||
keyAction = ACT_STOP;
|
||||
return;
|
||||
}
|
||||
runnerMoveStep(moveStep, stayCurrPos);
|
||||
}
|
||||
|
||||
function runnerMoveStep(action, stayCurrPos )
|
||||
{
|
||||
var x = runner.pos.x;
|
||||
var xOffset = runner.pos.xOffset;
|
||||
var y = runner.pos.y;
|
||||
var yOffset = runner.pos.yOffset;
|
||||
|
||||
var curToken, nextToken, centerX, centerY;
|
||||
var curShape, newShape;
|
||||
|
||||
curShape = newShape = runner.shape;
|
||||
|
||||
centerX = centerY = ACT_STOP;
|
||||
|
||||
switch(action) {
|
||||
case ACT_DIG_LEFT:
|
||||
case ACT_DIG_RIGHT:
|
||||
xOffset = 0;
|
||||
yOffset = 0;
|
||||
break;
|
||||
case ACT_UP:
|
||||
case ACT_DOWN:
|
||||
case ACT_FALL:
|
||||
if ( xOffset > 0 ) centerX = ACT_LEFT;
|
||||
else if (xOffset < 0) centerX = ACT_RIGHT;
|
||||
break;
|
||||
case ACT_LEFT:
|
||||
case ACT_RIGHT:
|
||||
if( yOffset > 0 ) centerY = ACT_UP;
|
||||
else if (yOffset < 0) centerY = ACT_DOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
curToken = map[x][y].base;
|
||||
|
||||
if ( action == ACT_UP ) {
|
||||
yOffset -= yMove;
|
||||
|
||||
if(stayCurrPos && yOffset < 0) yOffset = 0; //stay on current position
|
||||
else if(yOffset < -H2) { //move to y-1 position
|
||||
if ( curToken == BLOCK_T || curToken == HLADR_T ) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x][y-1], so set [x][y].act to previous state
|
||||
y--;
|
||||
yOffset = tileH + yOffset;
|
||||
if(map[x][y].act == GUARD_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
}
|
||||
newShape = "runUpDn";
|
||||
}
|
||||
|
||||
if ( centerY == ACT_UP ) {
|
||||
yOffset -= yMove;
|
||||
if( yOffset < 0) yOffset = 0; //move to center Y
|
||||
}
|
||||
|
||||
if ( action == ACT_DOWN || action == ACT_FALL) {
|
||||
var holdOnBar = 0;
|
||||
if(curToken == BAR_T) {
|
||||
if( yOffset < 0) holdOnBar = 1;
|
||||
else if(action == ACT_DOWN && y < maxTileY && map[x][y+1].act != LADDR_T) {
|
||||
action = ACT_FALL; //shape fixed: 2014/03/27
|
||||
}
|
||||
}
|
||||
|
||||
yOffset += yMove;
|
||||
|
||||
if(holdOnBar == 1 && yOffset >= 0) {
|
||||
yOffset = 0; //fall and hold on bar
|
||||
action = ACT_FALL_BAR;
|
||||
}
|
||||
if(stayCurrPos && yOffset > 0) yOffset = 0; //stay on current position
|
||||
else if(yOffset > H2) { //move to y+1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x][y+1], so set [x][y].act to previous state
|
||||
y++;
|
||||
yOffset = yOffset - tileH;
|
||||
if(map[x][y].act == GUARD_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
}
|
||||
|
||||
if(action == ACT_DOWN) {
|
||||
newShape = "runUpDn";
|
||||
} else { //ACT_FALL or ACT_FALL_BAR
|
||||
|
||||
if (y < maxTileY && map[x][y+1].act == GUARD_T) { //over guard
|
||||
//don't collision
|
||||
var id = getGuardId(x, y+1);
|
||||
if(yOffset > guard[id].pos.yOffset) yOffset = guard[id].pos.yOffset;
|
||||
}
|
||||
|
||||
if (action == ACT_FALL_BAR) {
|
||||
if(runner.lastLeftRight == ACT_LEFT) newShape = "barLeft";
|
||||
else newShape = "barRight";
|
||||
} else {
|
||||
if(runner.lastLeftRight == ACT_LEFT) newShape = "fallLeft";
|
||||
else newShape = "fallRight";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( centerY == ACT_DOWN ) {
|
||||
yOffset += yMove;
|
||||
if ( yOffset > 0 ) yOffset = 0; //move to center Y
|
||||
}
|
||||
|
||||
if ( action == ACT_LEFT) {
|
||||
xOffset -= xMove;
|
||||
|
||||
if(stayCurrPos && xOffset < 0) xOffset = 0; //stay on current position
|
||||
else if ( xOffset < -W2) { //move to x-1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x-1][y], so set [x][y].act to previous state
|
||||
x--;
|
||||
xOffset = tileW + xOffset;
|
||||
if(map[x][y].act == GUARD_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
}
|
||||
if(curToken == BAR_T) newShape = "barLeft";
|
||||
else newShape = "runLeft";
|
||||
}
|
||||
|
||||
if ( centerX == ACT_LEFT ) {
|
||||
xOffset -= xMove;
|
||||
if ( xOffset < 0) xOffset = 0; //move to center X
|
||||
}
|
||||
|
||||
if ( action == ACT_RIGHT ) {
|
||||
xOffset += xMove;
|
||||
|
||||
if(stayCurrPos && xOffset > 0) xOffset = 0; //stay on current position
|
||||
else if ( xOffset > W2) { //move to x+1 position
|
||||
if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr
|
||||
map[x][y].act = curToken; //runner move to [x+1][y], so set [x][y].act to previous state
|
||||
x++;
|
||||
xOffset = xOffset - tileW;
|
||||
if(map[x][y].act == GUARD_T) gameState = GAME_RUNNER_DEAD; //collision
|
||||
}
|
||||
if(curToken == BAR_T) newShape = "barRight";
|
||||
else newShape = "runRight";
|
||||
}
|
||||
|
||||
if ( centerX == ACT_RIGHT ) {
|
||||
xOffset += xMove;
|
||||
if ( xOffset > 0) xOffset = 0; //move to center X
|
||||
}
|
||||
|
||||
if(action == ACT_STOP ) {
|
||||
if(runner.action == ACT_FALL) {
|
||||
soundStop(soundFall);
|
||||
soundPlay("down");
|
||||
}
|
||||
if(runner.action != ACT_STOP){
|
||||
runner.sprite.stop();
|
||||
runner.action = ACT_STOP;
|
||||
}
|
||||
} else {
|
||||
runner.sprite.x = x * tileW + xOffset;
|
||||
runner.sprite.y = y * tileH + yOffset;
|
||||
runner.pos = { x:x, y:y, xOffset:xOffset, yOffset:yOffset};
|
||||
if(curShape != newShape) {
|
||||
runner.sprite.gotoAndPlay(newShape);
|
||||
runner.shape = newShape;
|
||||
}
|
||||
if(action != runner.action){
|
||||
if(runner.action == ACT_FALL) {
|
||||
soundStop(soundFall);
|
||||
soundPlay("down");
|
||||
} else if ( action == ACT_FALL) {
|
||||
soundPlay(soundFall);
|
||||
}
|
||||
runner.sprite.play();
|
||||
}
|
||||
if(action == ACT_LEFT || action == ACT_RIGHT) runner.lastLeftRight = action;
|
||||
runner.action = action;
|
||||
}
|
||||
map[x][y].act = RUNNER_T;
|
||||
|
||||
// Check runner to get gold (MAX MOVE MUST < H4 & W4)
|
||||
if( map[x][y].base == GOLD_T &&
|
||||
((!xOffset && yOffset >= 0 && yOffset < H4) ||
|
||||
(!yOffset && xOffset >= 0 && xOffset < W4) ||
|
||||
(y < maxTileY && map[x][y+1].base == LADDR_T && yOffset < H4) // gold above laddr
|
||||
)
|
||||
)
|
||||
{
|
||||
removeGold(x,y);
|
||||
soundPlay("getGold");
|
||||
decGold();
|
||||
//debug("gold = " + goldCount);
|
||||
if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) {
|
||||
drawScore(SCORE_GET_GOLD);
|
||||
} else {
|
||||
//for modern mode , edit mode
|
||||
drawGold(1); //get gold
|
||||
}
|
||||
}
|
||||
//if(!goldCount && !goldComplete) showHideLaddr();
|
||||
|
||||
//check collision with guard !
|
||||
checkCollision(x, y);
|
||||
}
|
||||
|
||||
//dec gold count
|
||||
function decGold()
|
||||
{
|
||||
if(--goldCount <= 0) {
|
||||
//if(!showHideLaddr() && runner.pos.y > 0) {
|
||||
showHideLaddr();
|
||||
if(runner.pos.y > 0 && playMode != PLAY_CLASSIC && playMode != PLAY_AUTO && playMode != PLAY_DEMO) {
|
||||
soundPlay("goldFinish");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeGold(x,y)
|
||||
{
|
||||
map[x][y].base = EMPTY_T;
|
||||
mainStage.removeChild(map[x][y].bitmap);
|
||||
map[x][y].bitmap = null;
|
||||
}
|
||||
|
||||
function addGold(x, y)
|
||||
{
|
||||
var tile;
|
||||
|
||||
map[x][y].base = GOLD_T;
|
||||
tile = map[x][y].bitmap = new createjs.Bitmap(preload.getResult("gold"));
|
||||
tile.setTransform(x * tileW, y * tileH,tileScale, tileScale); //x,y, scaleX, scaleY
|
||||
mainStage.addChild(tile);
|
||||
|
||||
moveSprite2Top(); //reset runner, guard & fill hole object order
|
||||
}
|
||||
|
||||
function showHideLaddr()
|
||||
{
|
||||
var haveHLadder = 0;
|
||||
for(var y = 0; y < NO_OF_TILES_Y; y++) {
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
if( map[x][y].base == HLADR_T) {
|
||||
haveHLadder = 1;
|
||||
map[x][y].base =LADDR_T;
|
||||
map[x][y].act =LADDR_T;
|
||||
map[x][y].bitmap.set({alpha:1}); //display laddr
|
||||
}
|
||||
}
|
||||
}
|
||||
goldComplete = 1;
|
||||
return haveHLadder;
|
||||
}
|
||||
|
||||
function checkCollision(runnerX, runnerY)
|
||||
{
|
||||
var x = -1, y = -1;
|
||||
//var dbg = "NO";
|
||||
|
||||
switch(true) {
|
||||
case ( runnerY > 0 && map[runnerX][runnerY-1].act == GUARD_T):
|
||||
x = runnerX; y = runnerY-1;
|
||||
//dbg = "UP";
|
||||
break;
|
||||
case ( runnerY < maxTileY && map[runnerX][runnerY+1].act == GUARD_T):
|
||||
x = runnerX; y = runnerY+1;
|
||||
//dbg = "DN";
|
||||
break;
|
||||
case ( runnerX > 0 && map[runnerX-1][runnerY].act == GUARD_T):
|
||||
x = runnerX-1; y = runnerY;
|
||||
//dbg = "LF";
|
||||
break;
|
||||
case ( runnerX < maxTileX && map[runnerX+1][runnerY].act== GUARD_T):
|
||||
x = runnerX+1; y = runnerY;
|
||||
//dbg = "RT";
|
||||
break;
|
||||
}
|
||||
//if( dbg != "NO") debug(dbg);
|
||||
if( x >= 0) {
|
||||
for(var i = 0; i < guardCount; i++) {
|
||||
if( guard[i].pos.x == x && guard[i].pos.y == y) break;
|
||||
}
|
||||
assert( (i < guardCount), "checkCollision design error !");
|
||||
if(guard[i].action != ACT_REBORN) {
|
||||
var dw = Math.abs(runner.sprite.x - guard[i].sprite.x);
|
||||
var dh = Math.abs(runner.sprite.y - guard[i].sprite.y);
|
||||
//debug (" dw = " + dw +"(" + tileW + ") dh = " + dh + "(" + tileH + ")" );
|
||||
/*
|
||||
debug("runner:" + runner.pos.x + ","
|
||||
+ runner.pos.y + ","
|
||||
+ "guard:" + guard[i].pos.x + ","
|
||||
+ guard[i].pos.y + ","
|
||||
|
||||
+ "runner:" + runner.pos.xOffset + ","
|
||||
+ runner.pos.yOffset + ","
|
||||
+ "guard:" + guard[i].pos.xOffset + ","
|
||||
+ guard[i].pos.yOffset
|
||||
);
|
||||
*/
|
||||
/*
|
||||
if( Math.abs(runner.sprite.x - guard[i].sprite.x) < tileW &&
|
||||
Math.abs(runner.sprite.y - guard[i].sprite.y) < tileH)
|
||||
*/
|
||||
if( Math.abs(runner.sprite.x - guard[i].sprite.x) <= W4*3 &&
|
||||
Math.abs(runner.sprite.y - guard[i].sprite.y) <= H4*3 )
|
||||
{
|
||||
gameState = GAME_RUNNER_DEAD;
|
||||
//debug("runner dead!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Page 276 misc.c (book)
|
||||
function ok2Dig(nextMove)
|
||||
{
|
||||
var x = runner.pos.x;
|
||||
var y = runner.pos.y;
|
||||
var token, rc = 0;
|
||||
|
||||
switch(nextMove) {
|
||||
case ACT_DIG_LEFT:
|
||||
// debug("[x-1][y+1] = " + map[x-1][y+1].act + " [x-1][y] = " + map[x-1][y].act +
|
||||
// "[x-1][y].base = " + map[x-1][y].base );
|
||||
|
||||
if( y < maxTileY && x > 0 && map[x-1][y+1].act == BLOCK_T &&
|
||||
map[x-1][y].act == EMPTY_T && map[x-1][y].base != GOLD_T)
|
||||
rc = 1;
|
||||
break;
|
||||
case ACT_DIG_RIGHT:
|
||||
// debug("[x+1][y+1] = " + map[x+1][y+1].act + " [x+1][y] = " + map[x+1][y].act +
|
||||
// "[x+1][y].base = " + map[x+1][y].base );
|
||||
|
||||
if( y < maxTileY && x < maxTileX && map[x+1][y+1].act == BLOCK_T &&
|
||||
map[x+1][y].act == EMPTY_T && map[x+1][y].base != GOLD_T)
|
||||
rc = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
function digHole(action)
|
||||
{
|
||||
var x,y, holeShape;
|
||||
|
||||
if(action == ACT_DIG_LEFT) {
|
||||
x = runner.pos.x-1;
|
||||
y = runner.pos.y;
|
||||
|
||||
runner.shape = "digLeft";
|
||||
holeShape = "digHoleLeft";
|
||||
|
||||
} else { //DIG RIGHT
|
||||
|
||||
x = runner.pos.x+1;
|
||||
y = runner.pos.y;
|
||||
|
||||
runner.shape = "digRight";
|
||||
holeShape = "digHoleRight";
|
||||
}
|
||||
|
||||
soundPlay(soundDig);
|
||||
map[x][y+1].bitmap.set({alpha:0}); //hide block (replace with digging image)
|
||||
runner.sprite.gotoAndPlay(runner.shape);
|
||||
|
||||
holeObj.sprite.gotoAndPlay(holeShape);
|
||||
holeObj.action = ACT_DIGGING;
|
||||
holeObj.pos = { x: x, y: y };
|
||||
holeObj.sprite.setTransform(x * tileW, y * tileH,tileScale, tileScale);
|
||||
|
||||
// the callback is called each time a sequence completes:
|
||||
holeObj.sprite.on("animationend", digComplete);
|
||||
|
||||
mainStage.addChild(holeObj.sprite);
|
||||
}
|
||||
|
||||
function isDigging()
|
||||
{
|
||||
var rc = 0;
|
||||
|
||||
if(holeObj.action == ACT_DIGGING) {
|
||||
var x = holeObj.pos.x, y = holeObj.pos.y;
|
||||
if(map[x][y].act == GUARD_T) { //guard come close to the digging hole !
|
||||
var id = getGuardId(x, y);
|
||||
if(holeObj.sprite.currentAnimationFrame < 6 && guard[id].pos.yOffset > -H4) {
|
||||
stopDigging(x,y);
|
||||
}
|
||||
} else {
|
||||
switch( runner.shape ) {
|
||||
case "digLeft":
|
||||
if(holeObj.sprite.currentAnimationFrame > 2 ) {
|
||||
runner.sprite.gotoAndStop("runLeft");
|
||||
runner.shape = "runLeft";
|
||||
runner.action = ACT_STOP;
|
||||
}
|
||||
break;
|
||||
case "digRight":
|
||||
if(holeObj.sprite.currentAnimationFrame > 2) {
|
||||
runner.sprite.gotoAndStop("runRight");
|
||||
runner.shape = "runRight";
|
||||
runner.action = ACT_STOP;
|
||||
}
|
||||
break;
|
||||
}
|
||||
rc = 1;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
function stopDigging(x,y)
|
||||
{
|
||||
//(1) remove holeObj
|
||||
holeObj.sprite.removeAllEventListeners ("animationend");
|
||||
holeObj.action = ACT_STOP; //no digging
|
||||
mainStage.removeChild(holeObj.sprite);
|
||||
|
||||
//(2) fill hole
|
||||
y++;
|
||||
map[x][y].act = map[x][y].base; //BLOCK_T
|
||||
assert(map[x][y].base == BLOCK_T, "fill hole != BLOCK_T");
|
||||
map[x][y].bitmap.set({alpha:1}); //display block
|
||||
|
||||
//(3) change runner shape
|
||||
switch( runner.shape ) {
|
||||
case "digLeft":
|
||||
runner.sprite.gotoAndStop("runLeft");
|
||||
runner.shape = "runLeft";
|
||||
runner.action = ACT_STOP;
|
||||
break;
|
||||
case "digRight":
|
||||
runner.sprite.gotoAndStop("runRight");
|
||||
runner.shape = "runRight";
|
||||
runner.action = ACT_STOP;
|
||||
break;
|
||||
}
|
||||
|
||||
soundStop(soundDig); //stop sound of digging
|
||||
}
|
||||
|
||||
function digComplete()
|
||||
{
|
||||
var x = holeObj.pos.x;
|
||||
var y = holeObj.pos.y + 1;
|
||||
|
||||
map[x][y].act = EMPTY_T;
|
||||
holeObj.sprite.removeAllEventListeners ("animationend");
|
||||
holeObj.action = ACT_STOP; //no digging
|
||||
mainStage.removeChild(holeObj.sprite);
|
||||
|
||||
fillHole(x, y);
|
||||
}
|
||||
|
||||
var fillHoleObj = [];
|
||||
function fillHole(x, y)
|
||||
{
|
||||
var fillSprite = new createjs.Sprite(holeData, "fillHole");
|
||||
|
||||
fillSprite.setTransform(x * tileW, y * tileH,tileScale, tileScale);
|
||||
fillSprite.on("animationend", fillComplete);
|
||||
fillSprite.play();
|
||||
mainStage.addChild(fillSprite);
|
||||
fillHoleObj.push(fillSprite);
|
||||
}
|
||||
|
||||
function moveFillHoleObj2Top()
|
||||
{
|
||||
for(var i = 0; i < fillHoleObj.length; i++) {
|
||||
moveChild2Top(mainStage, fillHoleObj[i]);
|
||||
}
|
||||
}
|
||||
|
||||
function fillComplete()
|
||||
{
|
||||
var x = this.x / tileW | 0; //this : scope default to the dispatcher
|
||||
var y = this.y / tileH | 0;
|
||||
|
||||
map[x][y].bitmap.set({alpha:1}); //display block
|
||||
this.removeAllEventListeners ("animationend");
|
||||
mainStage.removeChild(this);
|
||||
removeFillHoleObj(this);
|
||||
|
||||
switch(map[x][y].act) {
|
||||
case RUNNER_T : // runner dead
|
||||
//loadingTxt.text = "RUNNER DEAD";
|
||||
gameState = GAME_RUNNER_DEAD;
|
||||
runner.sprite.set({alpha:0}); //hidden runner --> dead
|
||||
break;
|
||||
case GUARD_T:
|
||||
var id = getGuardId(x,y);
|
||||
if(guard[id].hasGold > 0) { //guard has gold and not fall into the hole
|
||||
decGold();
|
||||
guard[id].hasGold = 0;
|
||||
}
|
||||
guardReborn(x,y);
|
||||
if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) {
|
||||
drawScore(SCORE_GUARD_DEAD);
|
||||
} else {
|
||||
//for modern mode & edit mode
|
||||
drawGuard(1); //guard dead, add count
|
||||
}
|
||||
break;
|
||||
}
|
||||
map[x][y].act = BLOCK_T;
|
||||
}
|
||||
|
||||
function removeFillHoleObj(spriteObj)
|
||||
{
|
||||
for(var i = 0; i < fillHoleObj.length; i++) {
|
||||
if(fillHoleObj[i] == spriteObj) {
|
||||
fillHoleObj.splice(i,1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
debug("removeFillHoleObj: design error!");
|
||||
}
|
||||
@@ -0,0 +1,437 @@
|
||||
|
||||
var modernScoreInfo, editScoreInfo;
|
||||
|
||||
//=======================
|
||||
// LOCAL STORAGE SET/GET
|
||||
//=======================
|
||||
|
||||
function setLastPlayMode()
|
||||
{
|
||||
var infoObj = { m:playMode, d:playData };
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
setStorage(STORAGE_LASTPLAY_MODE, infoJSON);
|
||||
}
|
||||
|
||||
function getClassicInfo()
|
||||
{
|
||||
var infoJSON;
|
||||
|
||||
if(playData == 1) {
|
||||
infoJSON = getStorage(STORAGE_CLASSIC_INFO1);
|
||||
levelData = levelData1;
|
||||
} else {
|
||||
infoJSON = getStorage(STORAGE_CLASSIC_INFO2);
|
||||
levelData = levelData2;
|
||||
}
|
||||
|
||||
if(infoJSON == null) {
|
||||
curScore = 0;
|
||||
curLevel = maxLevel = 1;
|
||||
runnerLife = RUNNER_LIFE;
|
||||
} else {
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
curScore = infoObj.s;
|
||||
curLevel = infoObj.l;
|
||||
maxLevel = infoObj.m;
|
||||
runnerLife = infoObj.r;
|
||||
}
|
||||
}
|
||||
|
||||
function setClassicInfo()
|
||||
{
|
||||
maxLevel = (maxLevel < curLevel)?curLevel:maxLevel;
|
||||
var infoObj = { s:curScore, l:curLevel, r:runnerLife, m: maxLevel };
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
if(playData == 1) setStorage(STORAGE_CLASSIC_INFO1, infoJSON);
|
||||
else setStorage(STORAGE_CLASSIC_INFO2, infoJSON);
|
||||
}
|
||||
|
||||
function clearClassicInfo()
|
||||
{
|
||||
if(playData == 1) clearStorage(STORAGE_CLASSIC_INFO1);
|
||||
else clearStorage(STORAGE_CLASSIC_INFO2);
|
||||
}
|
||||
|
||||
function getModernInfo()
|
||||
{
|
||||
var infoJSON;
|
||||
|
||||
if(playData == 1) {
|
||||
infoJSON = getStorage(STORAGE_MODERN_INFO1);
|
||||
levelData = levelData1;
|
||||
} else if(playData == 2) {
|
||||
infoJSON = getStorage(STORAGE_MODERN_INFO2);
|
||||
levelData = levelData2;
|
||||
} else {
|
||||
if(editLevels > 0) {
|
||||
infoJSON = getStorage(STORAGE_USER_INFO);
|
||||
levelData = editLevelData;
|
||||
} else { //no any user created level !
|
||||
playData = 1;
|
||||
infoJSON = getStorage(STORAGE_MODERN_INFO1);
|
||||
levelData = levelData1;
|
||||
}
|
||||
}
|
||||
|
||||
if(infoJSON == null) {
|
||||
curScore = 0;
|
||||
curLevel = 1;
|
||||
runnerLife = RUNNER_LIFE;
|
||||
} else {
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
curScore = 0;
|
||||
curLevel = infoObj.l;
|
||||
runnerLife = RUNNER_LIFE;
|
||||
}
|
||||
getModernScoreInfo();
|
||||
}
|
||||
|
||||
function setModernInfo()
|
||||
{
|
||||
var infoObj = { l:curLevel};
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
switch(playData) {
|
||||
case 1:
|
||||
setStorage(STORAGE_MODERN_INFO1, infoJSON);
|
||||
break;
|
||||
case 2:
|
||||
setStorage(STORAGE_MODERN_INFO2, infoJSON);
|
||||
break;
|
||||
case 3:
|
||||
setStorage(STORAGE_USER_INFO, infoJSON); //user created
|
||||
break;
|
||||
default:
|
||||
debug("setModernInfo() design error !");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function clearModernInfo()
|
||||
{
|
||||
switch(playData) {
|
||||
case 1:
|
||||
clearStorage(STORAGE_MODERN_INFO1);
|
||||
break;
|
||||
case 2:
|
||||
clearStorage(STORAGE_MODERN_INFO2);
|
||||
break;
|
||||
case 3:
|
||||
clearStorage(STORAGE_USER_INFO);
|
||||
break;
|
||||
default:
|
||||
debug("setModernInfo() design error !");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function getModernScoreInfo()
|
||||
{
|
||||
var infoJSON, levelSize;
|
||||
|
||||
switch(playData) {
|
||||
case 1:
|
||||
infoJSON = getStorage(STORAGE_MODERN_SCORE_INFO1);
|
||||
levelSize = levelData.length;
|
||||
break;
|
||||
case 2:
|
||||
infoJSON = getStorage(STORAGE_MODERN_SCORE_INFO2);
|
||||
levelSize = levelData.length;
|
||||
break;
|
||||
case 3:
|
||||
infoJSON = getStorage(STORAGE_USER_SCORE_INFO); //user created
|
||||
levelSize = MAX_EDIT_LEVEL;
|
||||
break;
|
||||
}
|
||||
|
||||
if(infoJSON) {
|
||||
modernScoreInfo = JSON.parse(infoJSON);
|
||||
if(modernScoreInfo.length != levelSize) infoJSON = null;
|
||||
}
|
||||
if(infoJSON == null) {
|
||||
modernScoreInfo = [];
|
||||
for(var i = 0; i < levelSize; i++) modernScoreInfo[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
function setModernScoreInfo()
|
||||
{
|
||||
var infoJSON = JSON.stringify(modernScoreInfo);
|
||||
|
||||
switch(playData) {
|
||||
case 1:
|
||||
setStorage(STORAGE_MODERN_SCORE_INFO1, infoJSON);
|
||||
break;
|
||||
case 2:
|
||||
setStorage(STORAGE_MODERN_SCORE_INFO2, infoJSON);
|
||||
break;
|
||||
case 3:
|
||||
setStorage(STORAGE_USER_SCORE_INFO, infoJSON);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//=====================
|
||||
// for edit mode
|
||||
//=====================
|
||||
|
||||
var editLevelData, editLevels = -1, editLevelInfo;
|
||||
|
||||
function delEditLevel(level)
|
||||
{
|
||||
if(level > editLevels || level< 1) return false;
|
||||
|
||||
var delId = editLevelInfo[level-1];
|
||||
|
||||
editLevelInfo.splice(level-1,1); //delete id and shift others
|
||||
editLevelInfo.push(delId); //put the deleted id to last of array
|
||||
clearStorage(STORAGE_USER_LEVEL+("00"+(delId)).slice(-3));
|
||||
if(--editLevels <= 0) {
|
||||
clearEditLevelInfo(); //no edit levels
|
||||
clearStorage(STORAGE_USER_SCORE_INFO); //clear user score info
|
||||
initEditLevelInfo();
|
||||
} else {
|
||||
setEditLevelInfo();
|
||||
delUserLevelScore(level);
|
||||
}
|
||||
|
||||
editLevelData.splice(level-1,1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function addEditLevel(levelMap)
|
||||
{
|
||||
if(editLevels >= MAX_EDIT_LEVEL) return false;
|
||||
setEditLevel(++editLevels, levelMap);
|
||||
//setStorage(STORAGE_USER_LEVEL+("00"+(editLevelInfo[editLevels])).slice(-3), levelMap);
|
||||
//editLevelData[editLevels] = levelMap;
|
||||
//++editLevels;
|
||||
setEditLevelInfo();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function setEditLevel(level, levelMap)
|
||||
{
|
||||
setStorage(STORAGE_USER_LEVEL+("00"+(editLevelInfo[level-1])).slice(-3), levelMap);
|
||||
editLevelData[level-1] = levelMap;
|
||||
}
|
||||
|
||||
function initEditLevelInfo()
|
||||
{
|
||||
editLevels = 0;
|
||||
editLevelInfo = [];
|
||||
for(var i = 0; i < MAX_EDIT_LEVEL; i++) {
|
||||
editLevelInfo[i] = i+1;
|
||||
}
|
||||
}
|
||||
|
||||
function getEditLevelInfo()
|
||||
{
|
||||
var infoJSON, levelMap;
|
||||
|
||||
if(editLevels >= 0) return; //just once
|
||||
|
||||
infoJSON = getStorage(STORAGE_EDIT_INFO);
|
||||
editLevelData = [];
|
||||
|
||||
if(infoJSON) {
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
editLevels = infoObj.no;
|
||||
editLevelInfo = infoObj.id;
|
||||
} else {
|
||||
initEditLevelInfo();
|
||||
if(getStorage(STORAGE_FIRST_PLAY) == null) {
|
||||
createUserDefaultLevel(); //first time, create user default level
|
||||
}
|
||||
}
|
||||
|
||||
for(var i = 0; i < editLevels; i++) {
|
||||
levelMap = getStorage(STORAGE_USER_LEVEL + ("00"+(editLevelInfo[i])).slice(-3));
|
||||
if(levelMap == null || levelMap.length != NO_OF_TILES_X * NO_OF_TILES_Y) {
|
||||
debug("LOCAL STORAGE: get edit level map failed (" + i + ") !");
|
||||
editLevels =i;
|
||||
break;
|
||||
}
|
||||
editLevelData[i] = levelMap;
|
||||
}
|
||||
|
||||
curScore = 0;
|
||||
curLevel = editLevels+1;
|
||||
runnerLife = RUNNER_LIFE;
|
||||
}
|
||||
|
||||
function setEditLevelInfo()
|
||||
{
|
||||
var infoObj = { no:editLevels, id: editLevelInfo};
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
setStorage(STORAGE_EDIT_INFO, infoJSON);
|
||||
}
|
||||
|
||||
function clearEditLevelInfo()
|
||||
{
|
||||
clearStorage(STORAGE_EDIT_INFO);
|
||||
}
|
||||
|
||||
function initNewLevelInfo(testInfo)
|
||||
{
|
||||
testInfo.level = editLevels+1;
|
||||
testInfo.levelMap = "";
|
||||
testInfo.pass = 0;
|
||||
testInfo.modified = 0;
|
||||
for(var i = 0; i < NO_OF_TILES_X * NO_OF_TILES_Y; i++)
|
||||
testInfo.levelMap += " "; //empty map
|
||||
}
|
||||
|
||||
function compareWithExist(existLevelMap, testLevelMap)
|
||||
{
|
||||
for(var i = 0; i < NO_OF_TILES_X * NO_OF_TILES_Y; i++) {
|
||||
if(existLevelMap.charAt(i) != testLevelMap.charAt(i)) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function getTestLevel(testInfo)
|
||||
{
|
||||
var infoJSON;
|
||||
|
||||
if((infoJSON = getStorage(STORAGE_TEST_LEVEL)) == null) {
|
||||
initNewLevelInfo(testInfo);
|
||||
} else {
|
||||
var init = testInfo.level<0?1:0;
|
||||
var infoObj = JSON.parse(infoJSON);
|
||||
|
||||
testInfo.level = infoObj.level;
|
||||
testInfo.levelMap = infoObj.map;
|
||||
testInfo.pass = infoObj.pass;
|
||||
|
||||
//BEGIN for debug ====================
|
||||
var i = 0;
|
||||
for(var y = 0; y < NO_OF_TILES_Y; y++) {
|
||||
var string = ""
|
||||
for(var x = 0; x < NO_OF_TILES_X; x++) {
|
||||
string += testInfo.levelMap[i++];
|
||||
}
|
||||
debug('"' + string + '"');
|
||||
}
|
||||
//END for debug ====================
|
||||
|
||||
if(testInfo.level > editLevels) testInfo.modified = 1;
|
||||
else {
|
||||
if(compareWithExist(editLevelData[infoObj.level-1], testInfo.levelMap) == 0) {
|
||||
if(init) {
|
||||
//same as exist level, new level
|
||||
clearTestLevel();
|
||||
initNewLevelInfo(testInfo);
|
||||
}
|
||||
} else {
|
||||
testInfo.modified = 1;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function setTestLevel(testInfo)
|
||||
{
|
||||
var infoObj = { level:testInfo.level, map: testInfo.levelMap, pass: testInfo.pass};
|
||||
var infoJSON = JSON.stringify(infoObj);
|
||||
|
||||
setStorage(STORAGE_TEST_LEVEL, infoJSON);
|
||||
}
|
||||
|
||||
function clearTestLevel()
|
||||
{
|
||||
clearStorage(STORAGE_TEST_LEVEL);
|
||||
}
|
||||
|
||||
function createUserDefaultLevel()
|
||||
{
|
||||
var myDefaultLevel = //Double Happy 2014/05/25
|
||||
"0-------- ------- ---------0" +
|
||||
"H & # $ # H" +
|
||||
"H #######S####### H" +
|
||||
"H $ # # $ H" +
|
||||
"H @@@#@@@S@@@#@@@ H" +
|
||||
"H # # H" +
|
||||
"H ####### ####### H" +
|
||||
"H # $ # # $ # H" +
|
||||
"H #@@#### ####@@# H" +
|
||||
"H X X H" +
|
||||
"H @@@#@@@X@@@#@@@ H" +
|
||||
"H # # H" +
|
||||
"H ####### ####### H" +
|
||||
"H # $ # # $ # H" +
|
||||
"H ####### ####### H" +
|
||||
"H # # H";
|
||||
|
||||
addEditLevel(myDefaultLevel);
|
||||
}
|
||||
|
||||
//=========================
|
||||
// for debug only
|
||||
//=========================
|
||||
function genUserLevel(levels)
|
||||
{
|
||||
var levelMap =
|
||||
" H " +
|
||||
" &H " +
|
||||
" ## " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " +
|
||||
" " ;
|
||||
getEditLevelInfo();
|
||||
while(editLevels > 0) delEditLevel(1); //clear all user level
|
||||
|
||||
for(var i = 1; i <= levels; i++) {
|
||||
var tmpMap = levelMap;
|
||||
var no = i%5;
|
||||
var str = "##########";
|
||||
for(var j = 0; j < no; j++) {
|
||||
var index = (no+j*2)*NO_OF_TILES_X;
|
||||
tmpMap = tmpMap.substr(0, index) + str + tmpMap.substr(index+str.length);
|
||||
}
|
||||
addEditLevel(tmpMap);
|
||||
}
|
||||
}
|
||||
|
||||
//=======================================
|
||||
// BEGIN for set|get|clear localstorage
|
||||
//=======================================
|
||||
function setStorage(key, value)
|
||||
{
|
||||
if(typeof(window.localStorage) != 'undefined'){
|
||||
window.localStorage.setItem(key,value);
|
||||
}
|
||||
}
|
||||
|
||||
function getStorage(key)
|
||||
{
|
||||
var value = null;
|
||||
if(typeof(window.localStorage) != 'undefined'){
|
||||
value = window.localStorage.getItem(key);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
function clearStorage(key)
|
||||
{
|
||||
if(typeof(window.localStorage) != 'undefined'){
|
||||
window.localStorage.removeItem(key);
|
||||
}
|
||||
}
|
||||