First Commit : Lode Runner v0.99k.1

Cette révision appartient à :
SimonHung
2014-06-20 16:33:36 +08:00
Parent 56792c1045
révision 243a4a95ca
84 fichiers modifiés avec 13767 ajouts et 3 suppressions
+5 -3
Voir le fichier
@@ -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).
------------------------------------
BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 326 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 326 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 188 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 188 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 5.7 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 51 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 6.3 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 18 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 147 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 2.8 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 148 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 131 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 2.6 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 190 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 32 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 163 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 1.7 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 163 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 191 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 288 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 1.4 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 856 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 16 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 316 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 118 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 2.1 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 183 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 177 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 198 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 3.8 KiB

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 163 B

BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 1.2 KiB

+14
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
+12
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
+18
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
+17
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
+2858
Voir le fichier
Fichier diff supprimé car celui-ci est trop grand Voir la Diff
+979
Voir le fichier
@@ -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#"
];
+158
Voir le fichier
@@ -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";
+458
Voir le fichier
@@ -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(" },");
}
+166
Voir le fichier
@@ -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 ]
}
];
+271
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
+955
Voir le fichier
@@ -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();
}
+756
Voir le fichier
@@ -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");
}
+357
Voir le fichier
@@ -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;
}
}
}
}
+52
Voir le fichier
@@ -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>
BIN
Voir le fichier
Fichier binaire non affiché.

Après

Largeur:  |  Hauteur:  |  Taille: 3.2 KiB

+222
Voir le fichier
@@ -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;
}
+1326
Voir le fichier
Fichier diff supprimé car celui-ci est trop grand Voir la Diff
+2601
Voir le fichier
Fichier diff supprimé car celui-ci est trop grand Voir la Diff
+212
Voir le fichier
@@ -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();
}
+436
Voir le fichier
@@ -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
}
}
+627
Voir le fichier
@@ -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!");
}
+437
Voir le fichier
@@ -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);
}
}
+830
Voir le fichier
Diff de fichier supprimé car une ou plusieurs lignes sont trop longues
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.
BIN
Voir le fichier
Fichier binaire non affiché.